¿Qué diferencia hay entre usar un puntero y usar &?
El operador &
devuelve la dirección de memoria de una variable (e incluso la de un puntero).
Un puntero simplemente es una variable que guarda la dirección de memoria de otra variable. El objetivo principal de los punteros es leer o escribir en memoria.
¿Qué diferencia hay entre estos dos programas?
int a = 15;
int *ptr = &a;
printf("%x",*ptr);
Y
int a = 15;
printf("%x",&a);
En el primer código, estás guardando la dirección de memoria de a
en el puntero ptr
y luego desreferencia el puntero para imprimir el contenido de la variable a
.
En el segundo código, en cambio, estás usando el operador ampersand para imprimir directamente la dirección de memoria de a
.
¿para que sirven los punteros, si podemos usar &?
En el ejemplo propuesto anteriormente no se ve la utilidad de los punteros pero si necesitaras modificar (o leer) el contenido de una variable durante la ejecución de una función, si sería útil.
Ejemplo:
void foo(int* x)
{
*v = 10;
}
int main(void)
{
int x = 1;
foo(&x);
printf("%d", x);
return 0;
}
De este modo, se emula el pase por referencia, aunque en C se lo suele llamar pase por puntero.
Un ejemplo clarísimo, es la funcion strlen, en la cual, devuelve la longitud de una cadena. Como verás, esta rutina tiene como parámetro, un puntero a char
, a partir de este puntero, es como puede leer el contenido del array (durante la ejecución de la función) y gracias a ello, puede retornar dicha longitud.
Otra utilidad de los punteros es cuando quieres crear un array dinámico. Para esto debes usar la función malloc (para reservar memoria) y sí o sí, debes usar punteros.
Ejemplo:
int main(void)
{
int n;
int* p;
printf("Ingrese la longitud del vector");
scanf("%d", &n);
p = malloc(n * sizeof(int)); //Crea un array de enteros de N elementos..
//more code..
return 0;
}
Con los punteros de C puedes hacer muchas cosas, sobretodo cuando inicias en estructura de datos (por ejemplo, tendrás que usar punteros para crear una lista enlazada).
Fuente:
Applications of Pointers