Cas particulier des chaînes littérales

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.

char t[] = "Hello";


Image fig1
char *p = "Hello";


Image fig2

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