Eso no es pasar por referencia, es pasar por valor como otros han dicho.
El lenguaje C es paso por valor sin excepción. Pasar un puntero como parámetro no significa pasar por referencia.
La regla es la siguiente:
Una función no puede cambiar el valor real de los parámetros.
Intentemos ver las diferencias entre los parámetros escalares y de puntero de una función.
Variables escalares
Este breve programa muestra el paso por valor utilizando una variable escalar. param
se llama parámetro formal y variable
en la invocación de la función se llama parámetro real. El incremento de nota param
en la función no cambia variable
.
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
El resultado es
I've received value 111
variable=111
Ilusión de paso por referencia
Cambiamos un poco el código. param
Es un puntero ahora.
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
El resultado es
I've received value 111
variable=112
Eso te hace creer que el parámetro se pasó por referencia. No era. Se pasó por valor, el valor de parámetro es una dirección. El valor de tipo int se incrementó, y ese es el efecto secundario que nos hace pensar que era una llamada de función de paso por referencia.
Punteros - pasados por valor
¿Cómo podemos mostrar / probar ese hecho? Bueno, tal vez podamos probar el primer ejemplo de variables escalares, pero en lugar de escalar, usamos direcciones (punteros). Veamos si eso puede ayudar.
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
El resultado será que las dos direcciones son iguales (no se preocupe por el valor exacto).
Resultado de ejemplo:
param's address -1846583468
ptr's address -1846583468
En mi opinión, esto demuestra claramente que los punteros se pasan por valor. De ptr
lo contrario sería NULL
después de la invocación de la función.