web-dev-qa-db-fra.com

Passer un tableau par référence

Comment fonctionne le passage d'un tableau alloué statiquement par référence?

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

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

Est-ce que (&myArray)[100] a une signification ou est-ce juste une syntaxe pour passer un tableau par référence? Je ne comprends pas les parenthèses séparées suivies de grands crochets ici. Merci.

153
John DB

C'est une syntaxe pour les références de tableau - vous devez utiliser (&array) pour indiquer au compilateur que vous voulez une référence à un tableau, plutôt que le tableau (non valide) de références int & array[100];.

EDIT: Quelques éclaircissements.

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

Ces trois sont différentes façons de déclarer la même fonction. Ils sont tous traités comme prenant un paramètre int *, vous pouvez leur transmettre n'importe quel tableau de taille.

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

Cela n'accepte que des tableaux de 100 entiers. Vous pouvez utiliser sizeof en toute sécurité sur x

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

Ceci est analysé comme un "tableau de références" - ce qui n’est pas légal.

202
Erik

C'est juste la syntaxe requise:

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

^ Passez le tableau de 100 int par référence au nom du paramètre myArray;

void Func(int* myArray)

^ Passer un tableau. Le tableau se désintègre en un pointeur. Ainsi, vous perdez des informations de taille.

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

^ Passez un pointeur de fonction. La fonction retourne un int et prend un double. Le nom du paramètre est myFunc.

43
Martin York

C'est une syntaxe. Dans les arguments de fonction int (&myArray)[100], les parenthèses qui entourent le &myArray sont nécessaires. si vous ne les utilisez pas, vous passerez un array of references et c'est parce que le subscript operator [] a une priorité supérieure sur le & operator.

Par exemple. int &myArray[100] // array of references

Donc, en utilisant type construction (), vous indiquez au compilateur que vous souhaitez une référence à un tableau de 100 entiers.

Par exemple int (&myArray)[100] // reference of an array of 100 ints

20
cpx

Les tableaux sont transmis par défaut par les pointeurs. Vous pouvez essayer de modifier un tableau dans un appel de fonction pour une meilleure compréhension.