Anuncios

Bienvenidos sean a este post, hoy continuaremos con los apuntadores.

Anuncios

En este post ya vimos algunas de las operaciones pero veamos algunas de las que dispondremos para los apuntadores:

  • Asignacion
  • Acceder al destino de los apuntadores
  • Limitadas operaciones arimeticas
  • La comparacion entre ellos
Anuncios

Hablemos del primer caso, la asignacion es un tema que vimos en este post y como dijimos no se le asigna un valor sino la direccion de la variable donde se encuentra el valor, y esto lo hacemos a traves del operador ampersand (&), veamos un caso:

int valores = 10;
int* a_valores = &valores;
Anuncios

Ahora pasemos como acceder al destino, si bien dijimos que debemos asignar solamente la direccion de memoria de una variable, esto es una verdad a medias, porque en realidad podemos asignarle un valor pero despues de haberle asignado la direccion de memoria, veamos un ejemplo simple:

int valores;
int* apValores = &valores;
valores = 10;
*apValores = 15;
Anuncios
Anuncios

Primero declaramos una variable, luego definimos un apuntador y le pasamos la direccion de la variable anterior, hasta aca todo igual, despues le asignamos un valor a la variable, ahora nuestra variable y nuestro apuntador poseen el mismo valor, y lo ultimo sera asignar un nuevo valor al «apuntador» pero en realidad lo hacemos en valores porque recuerden que esto solo apunta a esa direccion de memoria, esta ultimo accion se la llama desreferenciar, y siempre que asignemos o recuperemos el valor de esa direccion de memoria debemos hacerlo con este operador, recuerden lo que vimos en este post, es decir que ahora tenemos dos formas de poder acceder o modificar esa direccion de memoria ocupada.

Anuncios

La arimetica en apuntadores es un poco mas compleja porque solo algunas operaciones son aplicables, porque por ejemplo no es lo mismo sumar un valor a un entero en una direccion de memoria que sumar un valor a una direccion de memoria donde nos modificara la misma e iremos a cualquier otra parte de la memoria menos donde estabamos originalmente, mas adelante veremos como se aplica en los apuntadores a traves de los arrays.

Anuncios

Por ultimo podemos comparar dos apuntadores por las siguiente razones:

  • Un apuntador es igual o no igual a NULL?
  • Un apuntador es igual o no a una ubicacion identificada (variable)?
  • Un apuntador es igual o no a otro apuntador?
Anuncios

Estas preguntas debemos hacerlas asi porque unicamente podemos comparar por medio de los operadores de igual (==) y diferentes (!=) dado que como no controlamos el orden de como se asignara en memoria, utilizar los operadores de mayor (>) o menor (<) serian completamente inutiles, veamos un ejejemplo practico:

if (apValores == NULL)
{
	printf("No apunta a nada\n");
}
else if (apValores != NULL)
{
	printf("Apunta a algun lado\n");
}
Anuncios

Para esta ocasion no necesitamos desreferenciarlo porque lo comparamos con otro apuntador como es NULL, en este caso comparamos si es NULL o no, en caso de ser nulo significa que no apunta a ningun lado debido a que fue reseteado o algo similar, en caso contrario significa que existe y por lo tanto apunta a algun lado de la memoria, vamos a ver un par de casos mediante un ejemplo, para ello crearemos un archivo llamado ejemplo11.c y le agregaremos el siguiente codigo:

ejemplo11.c

#include <stdio.h>

int main()
{
	int valores;
	int* a_valores = &valores;

	if (a_valores == NULL)
	{
		printf("No apunta a nada\n");
	}
	else if(a_valores != NULL)
	{
		printf("Apunta a algun lado\n");
	}

	return 0;
}
Anuncios

Aqui declaramos una variable y definimos un apuntador a este, despues por medio de un condicional verificaremos si el apuntador que definimos anteriormente no esta asignado o lo mismo que decir es NULL, en caso de ser afirmativo mostraremos un mensaje indicando que no apunta de lo contrario si es distinto de NULL mostraremos un mensaje indicando que si apunta a algun lado, compilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo11
Apunta a algun lado
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Hasta aqui podemos ver lo que mencionamos un rato antes del ejemplo, vamos a tomar el codigo anterior y lo modificaremos de la siguiente manera:

#include <stdio.h>

int main()
{
	int valores;
	int otro_valor;

	int* a_valores = &valores;
	int* a_otro_ap = &otro_valor;

	if (a_valores == a_otro_ap)
	{
		printf("Apuntan a la misma direccion\n");
	}
	else if(a_valores != a_otro_ap)
	{
		printf("No apuntan a la misma direccion\n");
	}

	return 0;
}
Anuncios

En este caso agregamos una variable mas que simplemente la declaramos, luego agregamos otro apuntador llamado a_otro_ap y le agregamos la variable nueva que definimos anteriormente, por ultimo modificamos el condicional donde ahora verificamos entre apuntadores si son iguales o distintos y mostraremos un mensaje para cada uno de los casos, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo11
No apuntan a la misma direccion
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Como pueden ver hace una comparacion entre ambas y al no poseer la misma variable o uno ser definido con el otro no poseen la misma direccion de memoria por lo tanto nos devolvera que son distintas, estos son chequeos basicos pero que pronto veremos el porque.

Anuncios

En resumen, hoy hemos visto algunas operaciones basicas que podemos hacer con nuestros apuntadores, desde algunas que ya hemos visto en otros casos asi como un par de ejemplos para ver las comparaciones, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50