Como funciona a passagem de uma matriz alocada estaticamente por referência?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Tem (&myArray)[100]
algum significado ou é apenas uma sintaxe para passar qualquer matriz por referência? Eu não entendo parênteses separados seguidos por grandes colchetes aqui. Obrigado.
Respostas:
É uma sintaxe para referências de matriz - você precisa
(&array)
esclarecer ao compilador que deseja uma referência a uma matriz, em vez da matriz (inválida) de referênciasint & array[100];
.EDIT: Alguns esclarecimentos.
Essas três são maneiras diferentes de declarar a mesma função. Eles são todos tratados como
int *
parâmetros, você pode passar qualquer tamanho de matriz para eles.Isso aceita apenas matrizes de 100 números inteiros. Você pode usar com segurança
sizeof
emx
Isso é analisado como uma "matriz de referências" - o que não é legal.
fonte
int a, b, c; int arr[3] = {a, b, c};
?void foo(int & x[100]);
é analisado como "matriz de referências", por favor? É porque a regra "da direita para a esquerda"? Se sim, parece não ser consistente com o modo comovoid foo(int (&x)[100]);
é analisado como "uma referência a uma matriz". Desde já, obrigado.É apenas a sintaxe necessária:
^ Passe um array de 100
int
por referência, o nome dos parâmetros émyArray
;^ Passe uma matriz. A matriz deteriora para um ponteiro. Assim, você perde informações de tamanho.
^ Passe um ponteiro de função. A função retorna
int
e leva adouble
. O nome do parâmetro émyFunc
.fonte
É uma sintaxe. Nos argumentos da função,
int (&myArray)[100]
parênteses que envolvem o&myArray
são necessários. se você não usá-los, passará umarray of references
e isso ocorre porque osubscript operator []
arquivo tem maior precedência sobre o arquivo& operator
.Por exemplo
int &myArray[100] // array of references
Portanto, usando
type construction ()
você diz ao compilador que deseja uma referência a uma matriz de 100 números inteiros.Por exemplo
int (&myArray)[100] // reference of an array of 100 ints
fonte
array of references
" - o que, é claro, não pode existir, então você receberá um erro de compilação. É divertido para mim que as regras de precedência do operador insistem que isso deve acontecer por padrão de qualquer maneira.Matrizes são passadas por ponteiros por padrão. Você pode tentar modificar uma matriz dentro de uma chamada de função para entender melhor.
fonte
char arr[1]; foo(char arr[]).
, arr é degradado em um ponteiro; enquanto estiver usandochar arr[1]; foo(char (&arr)[1])
, arr é passado como referência. É notável que a forma anterior seja frequentemente considerada mal formada, pois a dimensão está perdida.foo(T* t)
e tem uma matrizT a[N];
, quando escrevefoo(a);
, acho que seria mais correto dizer que você está passando um ponteiro, não passando uma matriz e passando o ponteiro por valor.A seguir, cria-se uma função genérica, utilizando como referência uma matriz de qualquer tamanho e tipo:
brinque com o código.
fonte