El parámetro reference-to-array no permite que el tipo de matriz decaiga a tipo de puntero. es decir, el tipo de matriz exacto se conserva dentro de la función. (Por ejemplo, puede usar el truco sizeof arr/sizeof *arr
en el parámetro y obtener el recuento de elementos). El compilador también realizará la comprobación de tipos para asegurarse de que el tipo de argumento de la matriz sea exactamente el mismo que el tipo de parámetro de la matriz, es decir, si el parámetro se declara como una matriz de 10 entradas, se requiere que el argumento sea una matriz de exactamente 10 Ints y nada más.
De hecho, en situaciones en las que el tamaño de la matriz se fija en tiempo de compilación, utilizando una referencia-a-array (o puntero-a-array) declaraciones de parámetros se pueden preceived como el primario, forma preferida para pasar una matriz. La otra variante (cuando el tipo de matriz puede decaer a tipo de puntero) se reserva para situaciones en las que es necesario pasar matrices de en tiempo de ejecución.
Por ejemplo, la forma correcta de pasar una matriz de tamaño en tiempo de compilación para una función es
void foo(int (&arr)[10]); // reference to an array
o
void foo(int (*arr)[10]); // pointer to an array
Una manera posiblemente incorrecto sería el uso de un "decaído" aproximación
void foo(int arr[]); // pointer to an element
// Bad practice!!!
El enfoque "deteriorado" debe reservarse normalmente para matrices de tiempo de ejecución si ze y está acompañado normalmente por el tamaño real de la matriz en un parámetro independiente
void foo(int arr[], unsigned n); // pointer to an element
// Passing a run-time sized array
En otras palabras, no hay realmente ninguna matriz puntero a "por qué" cuando se trata de hacer referencia a array (o) pasando. Se supone que debes usar este método de forma natural, de forma predeterminada, siempre que puedas, si el tamaño de la matriz está fijado en tiempo de compilación. La pregunta "por qué" realmente debería surgir cuando utilizas el método "decaído" de pasar array. El método "decaído" solo se supone que se usa como un truco especializado para pasar arreglos de tamaño de tiempo de ejecución.
Lo anterior es básicamente una consecuencia directa de un principio más genérico.Cuando tiene un objeto "pesado" del tipo T
, normalmente lo pasa por el puntero T *
o por referencia T &
. Las matrices no son una excepción de este principio general. No tienen ninguna razón para estarlo.
Tenga en cuenta que, en la práctica, a menudo tiene sentido escribir funciones que funcionan con matrices de tamaño de tiempo de ejecución, especialmente cuando se trata de funciones genéricas a nivel de biblioteca. Tales funciones son más versátiles. Eso significa que a menudo hay una buena razón para usar el enfoque "decaído" en el código de la vida real. Sin embargo, esto no excusa al autor del código de reconocer las situaciones cuando el tamaño de la matriz se conoce en tiempo de compilación y usando la referencia -metodo de macetas en consecuencia.
Gracias, excelente respuesta. – Dan
... aunque estoy en desacuerdo con su última edición. Una matriz es un objeto "pesado", pero no se puede pasar una matriz por valor, a menos que la coloques en una estructura o algo. – Dan