Parámetros por referencia

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

.

Punteros a estructuras

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++;
}

Ejemplo

Escriba una función llamada cumpleaños, que añada uno a la edad de una persona.