C ++ passa uma matriz por referência

Isso é permitido passar uma matriz por referência?

void foo(double& *bar) 

Parece que meu compilador diz que não. Por quê? Qual é a maneira correta de passar uma matriz por referência? Ou um trabalho por aí? Eu tenho um argumento de matriz que o meu método deve modificar e que eu deveria recuperar depois. Alternativamente, eu poderia tornar este array um membro da class, o que funciona bem, mas tem muitos inconvenientes para outra parte do meu código (que eu gostaria de evitar).

Obrigado e cumprimentos.

Arrays só podem ser passados ​​por referência, na verdade:

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

Isso impede que você faça coisas como:

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

Para poder passar uma matriz de tamanho arbitrário para foo , crie um modelo e capture o tamanho da matriz em tempo de compilation:

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

Você deve considerar seriamente o uso de std::vector , ou se você tiver um compilador que suporte c ++ 11, std::array .

Sim, mas quando a correspondência de argumentos para uma referência, a matriz implícita para o ponteiro não é automática, então você precisa de algo como:

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

ou

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

Esteja ciente, no entanto, que quando combinando, double [42] e double [] são tipos distintos. Se você tiver uma matriz de uma dimensão desconhecida, ela corresponderá à segunda, mas não à primeira, e se você tiver uma matriz com 42 elementos, ela corresponderá à primeira, mas não à segunda . (Este último é, IMHO, muito contra-intuitivo.)

No segundo caso, você também terá que passar a dimensão, já que não há como recuperá-la quando estiver dentro da function.

Se você quiser modificar apenas os elementos:

 void foo(double *bar); 

basta.

Se você quiser modificar o endereço para (por exemplo, realloc ), mas não funciona para matrizes:

 void foo(double *&bar); 

é a forma correta.

Como você está usando C ++, a sugestão obrigatória que ainda está faltando aqui é usar std::vector .

Você pode facilmente passá-lo por referência:

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

E se você tiver suporte a C ++ 11, também dê uma olhada em std::array .

Para referência:

Como a outra resposta diz, coloque o & após o * .

Isso traz um ponto interessante que pode ser confuso às vezes: os tipos devem ser lidos da direita para a esquerda. Por exemplo, isso é (a partir do mais à direita * ) um ponteiro para um ponteiro constante para um int.

 int * const *x; 

O que você escreveu seria, portanto, um ponteiro para uma referência, o que não é possível.

8.3.5.8 Se o tipo de um parâmetro inclui um tipo de formulário “ponteiro para matriz de limite desconhecido de T” ou “referência para matriz de limite desconhecido de T”, o programa é mal-formado