27 votes

Ce n'est "12345" + 2 faire en C?

J'ai vu ce fait en C avant:

#define MY_STRING "12345"
...
#define SOMETHING (MY_STRING + 2)

Ce n'quelque CHOSE de développé pour, ici? Est-ce légal? Ou veulent-ils dire ça?:

#define SOMETHING (MY_STRING[2])

80voto

Ignacio Vazquez-Abrams Points 312628

Les littéraux de chaîne existent dans le fixe, le segment de données du programme, de sorte qu'ils semblent le compilateur comme un type de pointeur.

+-+-+-+-+-+--+
|1|2|3|4|5|\0|
+-+-+-+-+-+--+
 ^ MY_STRING
     ^ MY_STRING + 2

20voto

John Kugelman Points 108754

Lorsque vous avez un tableau ou un pointeur, p+x est équivalent à &p[x]. Donc, MY_STRING + 2 est équivalent à &MY_STRING[2]: il donne l'adresse de la troisième caractère de la chaîne.

Remarquez ce qui se passe lorsque vous ajoutez 0. MY_STRING + 0 est le même que &MY_STRING[0], qui sont tous deux la même que l'écriture tout simplement MY_STRING depuis une chaîne de référence est rien de plus qu'un pointeur vers le premier caractère de la chaîne. Heureusement, ensuite, l'identité de l'opération "ajouter 0" est un non-op. Considère ce fait comme une sorte d'unité mentale test que nous pouvons utiliser pour vérifier que notre idée sur ce qu' + moyen est correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X