En el lenguaje C, los parámetros en las funciones siempre se pasan por valor — es decir, se pasa una copia del valor desde el código que llama a la función. Si se necesita cambiar el valor de una variable fuera de la función, se utiliza el paso por puntero.
Al pasar un escalar (por ejemplo, int), la función recibe su copia:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, ¡no cambiará! }
Para cambiar el valor de una variable, se utiliza un puntero:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, ¡el valor ha cambiado! }
¿Es una matriz un parámetro de función pasado por referencia?
Muchos responden que "por referencia", sin embargo, en C, una matriz en la firma de la función no puede ser pasada por referencia, en realidad, se degrada a un puntero.
Respuesta correcta:
Cuando una matriz se pasa a una función, en realidad se pasa un puntero a su primer elemento. Es decir, la función llamada no conoce el tamaño real de la matriz, y cualquier cambio en los elementos de la matriz se refleja en la matriz original.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] será 100! }
Historia
int arr[10], pero en el código que llama, la matriz era de menor tamaño. Debido a que la función no conocía el tamaño real, ocurrió un desbordamiento de búfer y se dañó la memoria.