Les chaînes littérales viennent ajouter à la confusion, car on peut
déclarer
char t[] = "Hello";
et char *p = "Hello";
.
Dans le premier cas, le compilateur alloue un tableau de 6 caractères qu'il
initialise avec les caractères H, e, l, l, o et \0
.
Toute occurrence de t dans une expression sera convertie en type
pointeur vers char.
Dans le second cas, le compilateur alloue un tableau de 6 caractères qu'il
initialise de la même manière que dans le premier cas, mais de surcroît,
il alloue une variable de type pointeur vers char qu'il initialise
avec l'adresse du premier caractère de la chaîne.
Ceci est un cas particulier des tableaux de caractères qui ne se reproduit pas
avec les autres types.
On peut déclarer un tableau d'entiers par int t[] = {1, 2, 3, 4, 5};
,
mais on ne peut pas déclarer un pointeur vers un tableau d'entiers par :
int *p = {1, 2, 3, 4, 5};
.
Matthieu Moy
2017-02-08