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