11
votes

C Strings Pointeur vs. tableaux

Duplicaté possible:

Quelle est la différence entre Char S [ ] et char * s en C?

Pourquoi: xxx

différent de: xxx

spécifiquement, je ne vois pas pourquoi vous pouvez utiliser (* PTR) ++ Pour modifier la valeur de 'H' dans le tableau, mais pas le pointeur.

merci!

c

0 commentaires

5 Réponses :


0
votes

Les tableaux allouent automatiquement de l'espace et ils ne peuvent pas être déplacés ni redimensionnés, tandis que les pointeurs sont explicitement attribués à un espace alloué et peuvent être déplacés.

Les noms de tableau sont en lecture seule !


1 commentaires

Merci, mais cela ne répond pas à ma question. Je demande pourquoi (* PTR) ++ pour le tableau changera le 'H' à un "I", mais pas pour l'autre cas.



35
votes

Vous pouvez (en général) utiliser l'expression (* PTR) ++ code> pour modifier la valeur que PTR code> pointe sur lorsque PTR code> est un pointeur et non un tableau (c'est-à-dire si pTR code> est déclaré comme char * ptr code>).

Cependant, dans votre premier exemple: P>

char ptr[] = "Hello!";


7 commentaires

Et enfin, quelqu'un a répondu à ma question. Si j'avais un compte enregistré, je vous donnerais un uppote. Merci Monsieur.


@John McGee: Que vous avez posté une question signifie que vous avez un "compte", vous avez suffisamment de réputation pour uppote et vous pouvez toujours marquer une réponse comme "acceptée".


Je suis trop paresseux pour essayer maintenant, mais que (* PTR) ++ dans le premier cas aboutit vraiment à une erreur de compilateur? Le compilateur devra analyser si PTR n'a pas changé depuis l'initialisation, n'est-ce pas?


@Martin: il n'entraînera généralement pas une erreur de compilation (peut-être un avertissement si votre compilateur est intelligent et peut détecter que PTR pointe vers un littéral), mais cela entraînera souvent une exécution Erreur. Cependant, il pourrait sembler de travailler sur certaines plates-formes - mais c'est un comportement indéfini et doit être considéré comme un bogue sur n'importe quelle plate-forme.


@Michael: merci. Sans parler des cas où des chaînes constantes sont partagées (c'est-à-dire réutilisée), ce qui est beaucoup plus courant que je pense ...


@jamesdlin: Cela ne me laissera pas upvote jusqu'à ce que je m'inscrise. Je viens d'essayer.


Pour être pédants, PTR est un lvalue dans certains cas, comme lorsqu'il s'agit de l'opérande de taille de ou & : Stackoverflow.com/Questtions/39021998/...



0
votes

Si vous utilisez un littéral de chaîne "bonjour!" , le littéral lui-même devient un tableau de 7 caractères et est stocké quelque part dans une mémoire de données. Cette mémoire ne peut être en lecture seule.

La déclaration xxx

définit un pointeur sur char et l'initialise en stockant l'adresse du début du littéral (ce tableau de 7 caractères mentionné précédemment) dedans. Changer le contenu de la mémoire pointée par PTR est illégal.

La déclaration xxx

définit un char < / Code> Array ( Char PTR [7] ) et l'initialise en copiant des caractères du littéral au tableau. Le tableau peut être modifié.


0 commentaires

0
votes

in C chaînes sont des matrices de caractères. Un pointeur est une variable contenant l'emplacement de la mémoire d'une autre variable. Un tableau est un ensemble d'éléments de données commandés. Lorsque vous mettez (* PTR) ++, vous obtenez une erreur de segmentation avec le pointeur.

Peut-être que vous ajoutez 1 à la chaîne entière (avec le pointeur), au lieu d'ajouter 1 au premier caractère de la variable (avec le tableau).


0 commentaires

2
votes

Lorsque vous dirigez un littéral à chaîne, vous ne devez pas déclarer les caractères modifiables, et certains compilateurs vous avertiront pour cela:

const char *ptr = "Hello!"


0 commentaires