7
votes

Quelle est la différence entre un [0] et & a [0] dans la chaîne

string a = "asdf";
cout<<&a[0];
cout<<a[0];
Why are these two outputs different? Why is &a[0] not the address but the whole string? 

1 commentaires

Vous obtenez le char * à l'intérieur de cette chaîne comme expliqué en détail dans ce Réponse


3 Réponses :


13
votes

& a [0] a le type char * . Opérateur de flux <<< / code> est délibérément surchargé pour Const Char * Arguments pour produire une chaîne terminée zéro (chaîne de style C) qui commence à cette adresse. Par exemple. Si vous faites xxx

c'est cette version surchargée de <<< / code> qui garantit que le "bonjour monde!" String elle-même est envoyée à Sortie, pas la valeur du pointeur.

et c'est exactement ce qui rend votre code pour émettre la chaîne entière également. Depuis C ++ 11 STD :: String Les objets sont nécessaires pour stocker leurs données comme chaînes à terminaison zéro et & a [0] n'est rien d'autre qu'un pointeur au début de La chaîne stockée à l'intérieur de votre A objet.


1 commentaires

Addendum: Utiliser & a [0] au lieu de A est moins performant et ne peut pas faire face à des zéros incorporés ...



1
votes

Lors de l'impression d'un pointeur sur un flux de sortie de la bibliothèque standard, s'il est char * ou const char * , la chaîne de terminaison null pointée sur commande sera imprimée, plutôt que de l'adresse elle-même. Si vous souhaitez avoir l'adresse imprimée: xxx

(trivia: si le type de pointeur n'est pas convertible vers const Void * soit --- parce que c'est un Le pointeur de fonction ou un pointeur sur un membre ou il est volatil --- alors il est converti en bool .)


0 commentaires

1
votes

& a [0] Type de type Char * . Ceci est un type pour lequel opérateur << () est surchargé. Cette surcharge particulière imprime les caractères commençant à l'adresse jusqu'à ce qu'il trouve un caractère null, '\ 0' . Il n'imprimera pas l'adresse comme si vous vous attendez.

Depuis que vous avez besoin de l'adresse, il y a std :: adresse de () dans la bibliothèque standard: xxx < / Pré>

Vous pouvez également lancer vers Void * qui est presque comme la variante ci-dessus: xxx


2 commentaires

std :: adresse de (a [0]) est exactement le même que et a [0] ici, non?


@Mattmcnabb Oui, ils ont tous les deux le même effet. Mais std :: adresse de () ne prendra pas en compte surchargé opérateur et pour les types définis par l'utilisateur.