"Decay" fait référence à la conversion implicite d'une expression d'un type tableau vers un type pointeur. Dans la plupart des contextes, lorsque le compilateur voit une expression de tableau, il convertit le type de l'expression de "tableau à N éléments de T" en "pointeur sur T" et définit la valeur de l'expression à l'adresse du premier élément du tableau . Les exceptions à cette règle sont quand un tableau est un opérande soit des sizeof
ou &
opérateurs, ou le tableau est une chaîne littérale utilisé comme un initialiseur dans une déclaration.
Supposons le code suivant:
char a[80];
strcpy(a, "This is a test");
L'expression a
est de type "tableau de 80 éléments de char" et l'expression "Ceci est un test" est de type "tableau de 16 éléments de char" (en C; en C ++, les littéraux de chaîne sont des tableaux de const char). Cependant, dans l'appel à strcpy()
, aucune expression n'est un opérande de sizeof
ou &
, donc leurs types sont implicitement convertis en "pointeur vers char", et leurs valeurs sont définies à l'adresse du premier élément de chacun. Ce qui strcpy()
reçoit ne sont pas des tableaux, mais des pointeurs, comme le montre son prototype:
char *strcpy(char *dest, const char *src);
Ce n'est pas la même chose qu'un pointeur de tableau. Par exemple:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Les deux ptr_to_first_element
et ptr_to_array
ont la même valeur ; l'adresse de base de a. Cependant, ils sont de types différents et sont traités différemment, comme indiqué ci-dessous:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Rappelez - vous que l'expression a[i]
est interprétée comme *(a+i)
( ce qui ne fonctionne que si le type de tableau est converti en un type pointeur), donc à la fois a[i]
et le ptr_to_first_element[i]
travail même. L'expression (*ptr_to_array)[i]
est interprétée comme *(*a+i)
. Les expressions *ptr_to_array[i]
et ptr_to_array[i]
peuvent entraîner des avertissements ou des erreurs du compilateur selon le contexte; ils feront certainement la mauvaise chose si vous vous attendez à ce qu'ils évaluent a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Encore une fois, lorsqu'un tableau est un opérande de sizeof
, il n'est pas converti en type de pointeur.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
est un simple pointeur sur char.
int a[10]; int b(void);
,+a
est alors un pointeur int et+b
est un pointeur de fonction. Utile si vous souhaitez le passer à un modèle acceptant une référence.