Voici une hypothétique carte mémoire, montrant les résultats des deux déclarations:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x00008000: 'n' 'o' 'w' ' ' 'i' 's' ' ' 't'
0x00008008: 'h' 'e' ' ' 't' 'i' 'm' 'e' '\0'
...
amessage:
0x00500000: 'n' 'o' 'w' ' ' 'i' 's' ' ' 't'
0x00500008: 'h' 'e' ' ' 't' 'i' 'm' 'e' '\0'
pmessage:
0x00500010: 0x00 0x00 0x80 0x00
La chaîne littérale "c'est maintenant le temps" est stocké comme un 16-élément de tableau de char à l'adresse de mémoire 0x00008000. Cette mémoire peut ne pas être accessible en écriture, il est préférable de supposer qu'il ne l'est pas. Vous ne devriez jamais tenter de modifier le contenu d'une chaîne littérale.
La déclaration
char amessage[] = "now is the time";
alloue un 16-élément de tableau de char à l'adresse de mémoire 0x00500000 et copie le contenu de la chaîne littérale. Cette mémoire est accessible en écriture; vous pouvez modifier le contenu de amessage au contenu de votre coeur:
strcpy(amessage, "the time is now");
La déclaration
char *pmessage = "now is the time";
alloue un seul pointeur de char à l'adresse de mémoire 0x00500010 et copie l' adresse de la chaîne littérale.
Depuis pmessage points de la chaîne de caractères littérale, il ne devrait pas être utilisé comme un argument pour les fonctions qui ont besoin de modifier le contenu de la chaîne:
strcpy(amessage, pmessage); /* OKAY */
strcpy(pmessage, amessage); /* NOT OKAY */
strtok(amessage, " "); /* OKAY */
strtok(pmessage, " "); /* NOT OKAY */
scanf("%s", amessage); /* OKAY */
scanf("%s", pmessage); /* NOT OKAY */
und so weiter. Si vous avez changé pmessage à point à amessage:
pmessage = amessage;
ensuite, il peut être utilisé partout amessage peut être utilisé.