2011-04-20 19 views
120

¿Cómo funciona una matriz asignada estáticamente por referencia?Pasar una matriz por referencia

void foo(int (&myArray)[100]) 
{ 
} 

int main() 
{ 
    int a[100]; 
    foo(a); 
} 

¿Tiene (&myArray)[100] tiene ningún significado o su justo una sintaxis para pasar cualquier matriz por referencia? No entiendo el paréntesis por separado seguido de grandes corchetes aquí. Gracias.

+0

¿Hay alguna relación Rvalue a Lvalue con los parámetros de la función? –

+0

posible duplicado de [¿Qué es útil sobre un parámetro de referencia a matriz?] (Http://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – AnT

+0

Posible duplicado de [¿Qué es útil sobre un parámetro de referencia a matriz?] (https://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – anatolyg

Respuesta

162

Es una sintaxis para las referencias de matriz - necesita usar (&array) para aclarar al compilador que desea una referencia a una matriz, en lugar de la matriz (no válida) de referencias int & array[100];.

EDIT: Alguna aclaración.

void foo(int * x); 
void foo(int x[100]); 
void foo(int x[]); 

Estas tres formas diferentes de declarar la misma función. Todos se tratan como tomando un parámetro int *, puede pasar cualquier matriz de tamaño a ellos.

void foo(int (&x)[100]); 

Esto solo acepta matrices de 100 enteros. Usted puede utilizar con seguridad en sizeofx

void foo(int & x[100]); // error 

Esto se analiza como un "conjunto de referencias" - que no es legal.

+0

¿Por qué no podemos tener una serie de referencias, por ejemplo,? 'int a, b, c; int arr [3] = {a, b, c}; '? – Vorac

+4

Aha, descubierto [por qué] (http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal#1164306). – Vorac

+1

¿Podría alguien explicar por qué 'void foo (int & x [100]);' se analiza como "matriz de referencias", por favor? ¿Es porque la regla "de-derecha a izquierda"? En caso afirmativo, parece no ser coherente con la forma en que 'void foo (int (& x) [100]);' se analiza como "una referencia a una matriz". Gracias por adelantado. – zl9394

35

Es sólo la sintaxis requerida:

void Func(int (&myArray)[100]) 

^array Pass de 100 int por referencia el nombre parámetros es myArray;

void Func(int* myArray) 

^Pase una matriz. La matriz se descompone en un puntero. Por lo tanto, pierde información de tamaño.

void Func(int (*myFunc)(double)) 

^Pase un puntero a la función. La función devuelve un int y toma un double. El nombre del parámetro es myFunc.

+0

¿Cómo pasamos una matriz de tamaño variable como referencia? –

+0

@ShivamArora Puede personalizar la función y convertir el tamaño en un parámetro de plantilla. –

18

Es una sintaxis. En los argumentos de función int (&myArray)[100] son necesarios los paréntesis que encierran el &myArray. si no los usa, pasará un array of references y eso es porque el subscript operator [] tiene una precedencia más alta que el & operator.

E.g. 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.

por ejemplo int (&myArray)[100] // reference of an array of 100 ints

+0

"si no los usa, pasará una' serie de referencias' "que, por supuesto, no puede existir, por lo que obtendría un error de compilación. Es divertido para mí que las reglas de precedencia del operador insistan en que esto debe suceder por defecto de todos modos. –

+0

¿Hay más tutoriales sobre type construction()? – Iartist93

+0

Gracias, necesitaba una explicación que incluyera la razón sobre la precedencia del operador, lo que da una idea de por qué debería hacerse de esta manera. – cram2208

2

Las matrices son por defecto aprobada por punteros. Puede intentar modificar una matriz dentro de una llamada de función para una mejor comprensión.

+1

Las matrices no se pueden pasar por valor. Si la función recibe un puntero, una matriz se desintegra a un puntero a su primer elemento. No estoy seguro de lo que estás tratando de decir aquí. –

+0

@UlrichEckhardt que estoy tratando de decir que "Las matrices no se pueden pasar por valor", como se dijo antes, son por defecto pasado por referencia –

+4

matriz ni se pasan por valor ni referencia. Se pasan por punteros. Si las matrices se pasan por referencia de manera predeterminada, no tendrá problemas para usar sizeof en ellas. Pero ese no es el caso. Las matrices se desintegran a punteros cuando pasan a una función. – user3437460

Cuestiones relacionadas