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);
}
At (&myArray)[100]
-il 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.
Réponses:
C'est une syntaxe pour les références de tableau - vous devez l'utiliser
(&array)
pour clarifier au compilateur que vous voulez une référence à un tableau, plutôt que le tableau (invalide) de référencesint & array[100];
.EDIT: Quelques éclaircissements.
Ces trois méthodes sont différentes pour déclarer la même fonction. Ils sont tous traités comme prenant un
int *
paramètre, vous pouvez leur passer n'importe quel tableau de taille.Cela n'accepte que les tableaux de 100 entiers. Vous pouvez utiliser en toute sécurité
sizeof
surx
Ceci est analysé comme un "tableau de références" - ce qui n'est pas légal.
la source
int a, b, c; int arr[3] = {a, b, c};
?void foo(int & x[100]);
est analysé comme "tableau de références" s'il vous plaît? Est-ce à cause de la règle «de droite à gauche»? Si oui, cela ne semble pas cohérent avec la façon dontvoid foo(int (&x)[100]);
est analysée comme "une référence à un tableau". Merci d'avance.C'est juste la syntaxe requise:
^ Passez un tableau de 100
int
par référence, le nom des paramètres estmyArray
;^ Passez un tableau. Le tableau se désintègre en un pointeur. Ainsi, vous perdez des informations de taille.
^ Passez un pointeur de fonction. La fonction renvoie un
int
et prend undouble
. Le nom du paramètre estmyFunc
.la source
C'est une syntaxe. Dans la fonction, les arguments
int (&myArray)[100]
entre parenthèses qui entourent le&myArray
sont nécessaires. si vous ne les utilisez pas, vous passerez unarray of references
et c'est parce que lesubscript operator []
a une priorité plus élevée sur le& operator
.Par exemple
int &myArray[100] // array of references
Ainsi, en utilisant,
type construction ()
vous indiquez au compilateur que vous voulez une référence à un tableau de 100 entiers.Par exemple
int (&myArray)[100] // reference of an array of 100 ints
la source
array of references
" - qui, bien sûr, ne peut pas exister, donc vous obtiendrez une erreur de compilation. C'est amusant pour moi que les règles de priorité des opérateurs insistent sur le fait que cela doit se produire par défaut de toute façon.Les tableaux sont transmis par défaut par des pointeurs. Vous pouvez essayer de modifier un tableau dans un appel de fonction pour une meilleure compréhension.
la source
char arr[1]; foo(char arr[]).
, arr se dégrade en pointeur; lors de l'utilisationchar arr[1]; foo(char (&arr)[1])
, arr est passé comme référence. Il est à noter que l'ancienne forme est souvent considérée comme mal formée car la dimension est perdue.foo(T* t)
et que vous avez un tableau,T a[N];
lorsque vous écrivez,foo(a);
je pense qu'il serait plus correct de dire que vous passez un pointeur, pas un tableau, et que vous passez le pointeur par valeur.Ce qui suit crée une fonction générique, prenant un tableau de n'importe quelle taille et de n'importe quel type par référence:
jouer avec le code.
la source