C ++ pasa una matriz por referencia

¿se permite pasar una matriz por referencia?

void foo(double& *bar) 

Parece que mi comstackdor dice que no. ¿Por qué? ¿Cuál es la forma correcta de pasar una matriz por referencia? O un trabajo alrededor? Tengo un argumento de matriz que mi método debería modificar y que debería recuperar después. Alternativamente, podría hacer de este conjunto un miembro de la clase, que funciona bien, pero tiene muchos inconvenientes para otra parte de mi código (que me gustaría evitar).

Gracias y saludos.

Las matrices solo se pueden pasar por referencia, en realidad:

 void foo(double (&bar)[10]) { } 

Esto le impide hacer cosas como:

 double arr[20]; foo(arr); // won't compile 

Para poder pasar una matriz de tamaño arbitrario a foo , foo en una plantilla y captura el tamaño de la matriz en tiempo de comstackción:

 template void foo(T (&bar)[N]) { // use N here } 

Debería considerar seriamente usar std::vector , o si tiene un comstackdor que admita c ++ 11, std::array .

Sí, pero cuando se combinan argumentos para una referencia, la matriz implícita a puntero no es automática, por lo que necesita algo como:

 void foo( double (&array)[42] ); 

o

 void foo( double (&array)[] ); 

Tenga en cuenta, sin embargo, que cuando se combina, el double [42] y el double [] son tipos distintos. Si tiene una matriz de una dimensión desconocida, coincidirá con la segunda, pero no con la primera, y si tiene una matriz con 42 elementos, coincidirá con la primera pero no con la segunda . (El último es, en mi humilde opinión, muy contrario a la intuición).

En el segundo caso, también tendrá que pasar la dimensión, ya que no hay forma de recuperarla una vez que está dentro de la función.

Si quieres modificar solo los elementos:

 void foo(double *bar); 

es suficiente.

Si desea modificar la dirección a (por ejemplo: realloc ), pero no funciona para las matrices:

 void foo(double *&bar); 

es la forma correcta.

Como está usando C ++, la sugerencia obligatoria que aún falta aquí, es usar std::vector .

Puede pasarlo fácilmente por referencia:

 void foo(std::vector& bar) {} 

Y si tiene compatibilidad con C ++ 11, también eche un vistazo a std::array .

Para referencia:

Como dice la otra respuesta, pon el & después del * .

Esto trae a colación un punto interesante que a veces puede ser confuso: los tipos deben leerse de derecha a izquierda. Por ejemplo, esto es (comenzando desde el extremo derecho * ) un puntero a un puntero constante a un int.

 int * const *x; 

Lo que escribió, por lo tanto, sería un puntero a una referencia, que no es posible.

8.3.5.8 Si el tipo de un parámetro incluye un tipo de la forma “puntero a matriz de límite desconocido de T” o “referencia a matriz de límite desconocido de T”, el progtwig está mal formado