J'ai écrit ce script simple pour comprendre quelle référence est, et je suis coincé sur le tableau de charme.
3 0xbffff958 6 0xbffff95c 9 0xbffff960 12 0xbffff964 15 0xbffff968 -------------- a abcde b bcde c cde d de e
3 Réponses :
La raison est que La même chose n'est pas vraie d'une valeur Vous pouvez forcer la valeur de pointeur par CASTING: P> COUT code> "sait" Que faire avec un
Char * code> Valeur - Il imprime la chaîne de caractères sous forme de chaîne C Nul-terminée.
int * code>, donc
cout code> imprime la valeur du pointeur. p>
cout << static_cast<void *>(&letters[i]) << endl;
Vous regardez une particularité de flux C ++. Il essaie de convertir ses arguments en quelque chose qui est généralement imprimable. Le type de cette expression est & ints [x] code>
int * code>.
& caractères [x] code> devient
char * code> qui est d'ailleurs également le type d'une chaîne de caractères C. Comme nous le voulons, ce
COUT << "FOO" ' CODE> Pour imprimer toute la chaîne, il est nécessaire de disposer de ce comportement. Dans votre cas, cela entraîne réellement un comportement non défini lorsque la chaîne que vous utilisez n'est pas correctement terminée de null. Pour résoudre ce problème, utilisez un
static_cast code>. P>
Lorsque vous passez à ostream :: opérateur <<< / code> (En fait, il s'agit d'une fonction globale, non d'un opérateur) l'argument de type
Char * code>, il est considéré. comme une chaîne de finition nulle. p>
Je ne sais pas la norme spécifie qu'il doit être ASCII.
Je suis semi surpris que la deuxième partie ne cassait pas tout pour l'enfer et le dos, considérant qu'enfait que le code dit,
lettres code> n'est pas terminé à la nuls. Mais alors, UB signifie "tout ce qui peut arriver, même le programme travaillant apparemment".
@CHAO: Certains compilateurs zéro initialisent beaucoup de choses lors de la compilation du mode de débogage. Peut-être que l'OP était "chanceux".
Je suis surpris que personne n'en ait déjà mentionné cela, mais cela n'a rien à voir avec des références. Vous parlez de pointeurs.