Un puntero es un tipo de variable «especial» en el sentido de que no guarda directamente un valor, sino que guarda la dirección de la memoria en donde se encuentra ese valor, esta es una de las principales y mas potentes características del puntero, ya que nos permite acceder indirectamente a la memoria en lugar de la memoria que ya accedemos directamente al haber declarado la variable, aunque esto también supone un potencial problema para nuestra aplicación pues un puntero que dirige a una dirección de memoria invalida, protegida por el sistema o que halla sido eliminada generalmente causara errores de acceso a memoria conocidos principalmente como «Error de violación de acceso a memoria» en windows o como «segmentation fault» en los sistemas *nix en ambos casos se refieren a lo mismo, intentamos leer de o escribir a una dirección protegida en la cual nuestra aplicación no debería de estar intentado nada, en algunos casos puede llevar a una pantalla azul de la muerte (muy común) o un kernel panic (solo lo he visto en sistemas hackintosh)
Los punteros son muy útiles por ejemplo cuando se requiere que una función regrese mas de un valor o afecte directamente a los valores de entrada por ejemplo:
supongamos que necesitamos realizar una función que intercambie dos valores enteros a y b, como en c no podemos regresar mas de un valor y dado que por defecto en una función los datos se pasan por valor
1 2 3 4 5 6 | void intercambio (int *a,int *b){ int tmp = *a; // guardar el valor apuntado por a en una variable temporal *a = *b; //guardar el valor apuntado por b en la memoria apuntada por a *b = tmp; // guardar el valor de tmp en la memoria apuntada por b return; } |
como ya mencione al declarar una función en c por defecto los valores se pasan por valor, esto quiere decir que se hace una copia del valor de los parámetros y se le dan a la función para que trabaje con ellos, por el contrario cuando indicamos que los valores se devén de pasar por referencia (se hace anteponiendo un * al nombre de la variable)la función recibe la dirección de la memoria donde se almacena dicho valor.
para pasar un valor por referencia no se puede pasar como se hace con los parámetros por valor, para pasar un parámetro por referencia tenemos que indicarlo al compilador anteponiendo un & antes del nombre de la variable, este símbolo indica a c que debe de dar la dirección de memoria en vez del valor de la variable:
1 2 3 4 5 6 | int a=10,b=20; printf("antes:n") printf("a: %i, b: %in",a,b); intercambio(&a,&b); printf("despues:n") printf("a: %i, b: %in",a,b); |
este código imprimira primero:
antes: a: 10, b: 20
y luego de realizar el cambio:
despues: a: 20, b: 10
Debe estar conectado para enviar un comentario.