Pasar una matriz a una función por valor

A continuación se muestra un fragmento del libro C Progtwigción Solo las preguntas frecuentes . ¿No está mal, ya que las matrices nunca se pueden pasar por referencia?

VIII.6: ¿Cómo se puede pasar una matriz a una función por valor?

Respuesta: Una matriz se puede pasar a una función por valor al declarar en la función llamada el nombre de la matriz con corchetes ( [ y ] ) unidos al final. Cuando llame a la función, simplemente pase la dirección de la matriz (es decir, el nombre de la matriz) a la función llamada. Por ejemplo, el siguiente progtwig pasa la matriz x[] a la función llamada byval_func() por valor:

El parámetro int[] le dice al comstackdor que la función byval_func() tomará un argumento, una matriz de enteros. Cuando se llama a la función byval_func() , pasas la dirección de la matriz a byval_func() :

 byval_func(x); 

Debido a que la matriz se está pasando por valor, se realiza una copia exacta de la matriz y se coloca en la stack. La función llamada luego recibe esta copia de la matriz y puede imprimirla. Debido a que la matriz pasada a byval_func() es una copia de la matriz original, la modificación de la matriz dentro de la función byval_func() no tiene ningún efecto en la matriz original.

Debido a que la matriz se está pasando por valor, se realiza una copia exacta de la matriz y se coloca en la stack.

Esto es incorrecto: la matriz no se está copiando , solo una copia del puntero a su dirección se pasa al destinatario (colocado en la stack). (Independientemente de si declara el parámetro como int[] o int* , se descompone en un puntero .) Esto le permite modificar el contenido de la matriz desde dentro de la función llamada . Por lo tanto, esto

Debido a que la matriz pasada a byval_func () es una copia de la matriz original, la modificación de la matriz dentro de la función byval_func () no tiene ningún efecto en la matriz original.

es completamente erróneo (felicitaciones a @Jonathan Leffler por su comentario a continuación). Sin embargo, reasignar el puntero dentro de la función no cambiará el puntero a la matriz original fuera de la función.

Quema ese libro. Si desea una C FAQ real que no haya sido escrita por un progtwigdor principiante, utilice esta: http://c-faq.com/aryptr/index.html .

Sintaxis, estrictamente hablando, no se puede pasar una matriz por valor en C.

 void func (int* x); /* this is a pointer */ void func (int x[]); /* this is a pointer */ void func (int x[10]); /* this is a pointer */ 

Sin embargo , para el registro, hay un sucio truco en C que le permite pasar una matriz por valor en C. ¡No intente esto en casa! Porque a pesar de este truco, todavía no hay razón para pasar una matriz por valor.

 typedef struct { int my_array[10]; } Array_by_val; void func (Array_by_val x); 

En C y C ++ NO es posible pasar un bloque completo de memoria por valor como parámetro a una función, pero podemos pasar su dirección. En la práctica, esto tiene casi el mismo efecto y es una operación mucho más rápida y más eficiente.

Para estar seguro, puede pasar el tamaño de matriz o poner el calificador const antes del puntero para asegurarse de que el destinatario no lo cambie.

 #include void fun(int a[],int n); int main() { int a[5]={1,2,3,4,5}; fun(a,5); } void fun(int a[],int n) { int i; for(i=0;i<=n-1;i++) printf("value=%d\n",a[i]); } 

Con este método podemos pasar la matriz por valor, pero en realidad la matriz está accediendo a través de su dirección base, que en realidad está copiando en la stack.