¿Cómo funciona pasar una matriz asignada estáticamente por referencia?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
¿ (&myArray)[100]
Tiene algún significado o es solo una sintaxis para pasar cualquier matriz por referencia? No entiendo paréntesis separados seguidos de grandes corchetes aquí. Gracias.
Respuestas:
Es una sintaxis para las referencias de matriz: debe usar
(&array)
para aclarar al compilador que desea una referencia a una matriz, en lugar de la matriz de referencias (no válida)int & array[100];
.EDITAR: Alguna aclaración.
Estas tres son formas diferentes de declarar la misma función. Todos se tratan como si tomaran un
int *
parámetro, puede pasarles cualquier tamaño de matriz.Esto solo acepta matrices de 100 enteros. Puede usar con seguridad
sizeof
enx
Esto se analiza como un "conjunto de referencias", que no es legal.
fuente
int a, b, c; int arr[3] = {a, b, c};
?void foo(int & x[100]);
se analiza como "conjunto de referencias" por favor? ¿Es porque la regla de "de derecha a izquierda"? En caso afirmativo, parece no ser coherente con la forma en quevoid foo(int (&x)[100]);
se analiza como "una referencia a una matriz". Gracias por adelantado.Es solo la sintaxis requerida:
^ Pase la matriz de 100
int
por referencia, el nombre del parámetro esmyArray
;^ Pase una matriz. La matriz se descompone en un puntero. Por lo tanto, pierde información sobre el tamaño.
^ Pase un puntero de función. La función devuelve an
int
y toma adouble
. El nombre del parámetro esmyFunc
.fuente
Es una sintaxis. En la función, los argumentos
int (&myArray)[100]
entre paréntesis que encierran&myArray
son necesarios. si no los usa, pasará unarray of references
y eso se debe a quesubscript operator []
tiene mayor prioridad sobre el& operator
.P.ej
int &myArray[100] // array of references
Entonces, al usar,
type construction ()
le dice al compilador que desea una referencia a una matriz de 100 enteros.P.ej
int (&myArray)[100] // reference of an array of 100 ints
fuente
array of references
", que por supuesto no puede existir, por lo que obtendrá un error de compilación. Es divertido para mí que las reglas de precedencia del operador insistan en que esto debe suceder de manera predeterminada de todos modos.Las matrices se pasan por defecto por punteros. Puede intentar modificar una matriz dentro de una llamada de función para una mejor comprensión.
fuente
char arr[1]; foo(char arr[]).
, arr se degrada a un puntero; mientras se usachar arr[1]; foo(char (&arr)[1])
, arr se pasa como referencia. Es notable que la forma anterior a menudo se considera mal formada ya que la dimensión se pierde.foo(T* t)
y tiene una matrizT a[N];
, cuando escribafoo(a);
, creo que sería más correcto decir que está pasando un puntero, no pasando una matriz, y está pasando el puntero por valor.Lo siguiente crea una función genérica, tomando una matriz de cualquier tamaño y de cualquier tipo por referencia:
Juega con el código.
fuente