Différence entre char* et char[]
Je sais que c'est une question très simple. Je suis confus quant à pourquoi et comment sont différents.
char str[] = "Test";
char *str = "Test";
- Les réponses ci-dessous assez bien l'expliquer, mais une autre différence est que le tableau variante vous donne un moyen pratique de prendre la taille de la chaîne initiale (y compris le terminateur null) -
sizeof(str)
. - Voir aussi: stackoverflow.com/q/1287306/365102
- Mon conseil: lisez l'article 6 de la comp.lang.c FAQ.
- Cela doit faire partie de la
[c++-faq]
? - ...Voir aussi ma réponse à une question similaire: stackoverflow.com/questions/6823249/c-pointer-question/...
Vous devez vous connecter pour publier un commentaire.
Est un tableau de
chars
, initialisé avec le contenu de "Test", tandis queest un pointeur vers le littéral (const) chaîne "Test".
La principale différence entre eux est que le premier est un tableau et l'autre est un pointeur. Le tableau est propriétaire de son contenu, qui s'avèrent être une copie de
"Test"
, alors que le pointeur désigne simplement le contenu de la chaîne (qui dans ce cas est immuable).char* str
couramment utilisée lors de l'str
désigne une chaîne de caractères. N'est-ce passtr[]
mieux?char *str
même queconst char * str
si les deux dénote des constantes?warning: deprecated conversion from string constant to ‘char*’
char *str = "Test";
est en fait illégal de départ en C++11?char *str = "Test";
alors cela veut dire que le littéral "Test" est stocké quelque part dans la mémoire?Est un pointeur et un tableau est. Ils sont différents de ce type de données.
sortie
sizeof array 20
sizeof pointer 4
Un pointeur peut être re-pointé quelque chose d'autre:
Le dernier exemple de l'incrémentation du pointeur de la montre que vous pouvez facilement parcourir le contenu d'une chaîne, un élément à la fois.
La première
est un tableau de cinq caractères, initialisé avec la valeur
"Test"
plus le terminateur null'\0'
.La deuxième
est un pointeur vers l'emplacement de la mémoire de la chaîne littérale
"Test"
.{'T', 'e', 's', 't', '\0'}
.T
) et en allant vers la droite jusqu'à ce que le terminateur null est atteint.La diference est la PILE de la mémoire utilisée.
Par exemple lors de la programmation de microcontrôleurs où très peu de mémoire de la pile est allouée, fait une grande différence.
À partir de C++11, la deuxième expression est maintenant invalide et doit être écrit:
La section pertinente de la norme de l'Annexe C de l'article 1.1:
char* fun()
? Il n'y aura aucune modification dans la spécification du type de retour ou la valeur retournée maintenant?const char*
."Test"
est un tableau de cinq caractères (4 lettres, plus le terminateur null.char str1[] = "Test";
crée ce tableau de 5 caractères, et les noms qu'ilstr1
. Vous pouvez modifier le contenu de ce tableau autant que vous le souhaitez, par exemple,str1[0] = 'B';
char *str2 = "Test";
crée ce tableau de 5 caractères, n'a pas de nom, et crée également un pointeur nomméstr2
. Il définitstr2
à point à qui de tableau de 5 caractères. Vous pouvez suivre le pointeur de modifier le tableau comme beaucoup que vous le souhaitez, par exemple,str2[0] = 'B';
ou*str2 = 'B';
. Vous pouvez même réaffecter le pointeur à point à un autre endroit, par exemplestr2 = "other";
.Un tableau est le texte entre guillemets. Le pointeur se borne à cela. Vous pouvez faire beaucoup de choses semblables avec chacun, mais ils sont différents:
pour cette dernière partie, notez que sizeof(gest) va varier en fonction de l'architecture. Sur une machine 32 bits, il sera de 4 octets, sur une machine 64 bits, il sera de 8 octets.
strp[0] = 'W';
ne fonctionne pas.strp[0] = 'W';
invoque un comportement indéterminé, parce qu'il tente de modifier une chaîne constante.