Duplicaté possible: strong>
Quelle est la différence entre Char S [ ] et char * s en C? p>Pourquoi: p>
xxx pré> différent de: p>
xxx pré> spécifiquement, je ne vois pas pourquoi vous pouvez utiliser (* PTR) ++ Pour modifier la valeur de 'H' dans le tableau, mais pas le pointeur. p>
merci! P> blockquote>
5 Réponses :
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. P>
Les noms de tableau sont en lecture seule em>! p>
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.
Vous pouvez (en général) utiliser l'expression Cependant, dans votre premier exemple: P> (* 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>). char ptr[] = "Hello!";
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 code> 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 code> est un lvalue dans certains cas, comme lorsqu'il s'agit de l'opérande de taille de code> ou & code>: Stackoverflow.com/Questtions/39021998/...
Si vous utilisez un littéral de chaîne La déclaration p> définit un pointeur sur La déclaration p> définit un "bonjour!" code>, 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. char code> 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 code> est illégal. P> char < / Code> Array ( Char PTR [7] CODE>) et l'initialise en copiant des caractères du littéral au tableau. Le tableau peut être modifié. P> p>
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. P>
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). P>
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!"