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. paramse llama parámetro formal y variableen la invocación de la función se llama parámetro real. El incremento de nota paramen 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. paramEs 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 ptrlo contrario sería NULLdespués de la invocación de la función.