Los argumentos de una función se pasan por valor, lo que significa que se copian dentro y fuera de las funciones. Pero, ¿y si copiamos punteros en lugar de los propios valores? Esto nos permitirá dar a las funciones funciones el control sobre las variables y estructuras de las funciones principales, y no solo una copia de ellas.
Digamos que queremos escribir una función que incremente un número por uno, llamado addone
. Esto no funcionará:
void addone(int n) { n++; } int n; printf("Antes: %d\n", n); addone(n); printf("Después: %d\n", n);
Sin embargo, esto sí funcionará:
void addone(int * n) { (*n)++; } int n; printf("Antes: %d\n", n); addone(&n); printf("Después: %d\n", n);
La diferencia es que la segunda versión de addone
recibe un puntero a la variable n
como argumento, y luego puede manipularlo, porque sabe dónde está en la memoria
Observe que cuando se llama a la función addone
, debemos pasar una referencia a la variable n
, y no la variable en sí misma, esto se hace para que la función conozca la dirección de la variable y no reciba una copia de la propia variable
Digamos que queremos crear una función que mueva un punto hacia adelante en ambas direcciones, x
e y
, llamada move
. En lugar de enviar dos punteros, ahora podemos enviar a la función un solo puntero de la estructura de puntos:
void move(point * p) { (*p).x++; (*p).y++; }
Sin embargo, si deseamos desreferenciar una estructura y acceder a uno de sus miembros internos, tenemos una sintaxis abreviada para eso, porque esta operación se usa ampliamente en las estructuras de datos. Podemos reescribir esta función usando la siguiente sintaxis:
void move(point * p) { p->x++; p->y++; }
Escriba una función llamada cumpleaños, que añada uno a la edad de una persona.