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?
3 Réponses :
c'est cette version surchargée de et c'est exactement ce qui rend votre code pour émettre la chaîne entière également. Depuis C ++ 11 & a [0] code> a le type char * code>. Opérateur de flux <<< / code> est délibérément surchargé pour Const Char * code> Arguments pour produire une chaîne terminée zéro (chaîne de style C) qui commence à cette adresse. Par exemple. Si vous faites <<< / code> qui garantit que le "bonjour monde!" code> String elle-même est envoyée à Sortie, pas la valeur du pointeur. p> STD :: String Code> Les objets sont nécessaires pour stocker leurs données comme chaînes à terminaison zéro et & a [0] code> n'est rien d'autre qu'un pointeur au début de La chaîne stockée à l'intérieur de votre A code> objet. p> p>
Addendum: Utiliser & a [0] code> au lieu de A code> est moins performant et ne peut pas faire face à des zéros incorporés ...
Lors de l'impression d'un pointeur sur un flux de sortie de la bibliothèque standard, s'il est (trivia: si le type de pointeur n'est pas convertible vers char * code> ou const char * code>, 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: const Void * code> 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 code>.) p> p>
Depuis que vous avez besoin de l'adresse, il y a Vous pouvez également lancer vers & a [0] code> Type de type Char * code>. Ceci est un type pour lequel opérateur << () code> est surchargé. Cette surcharge particulière imprime les caractères commençant à l'adresse jusqu'à ce qu'il trouve un caractère null, '\ 0' code>. Il n'imprimera pas l'adresse comme si vous vous attendez. std :: adresse de () code> dans la bibliothèque standard: p> Void * code> qui est presque comme la variante ci-dessus: p>
std :: adresse de (a [0]) code> est exactement le même que et a [0] code> ici, non?
@Mattmcnabb Oui, ils ont tous les deux le même effet. Mais std :: adresse de () code> ne prendra pas en compte surchargé opérateur et code> pour les types définis par l'utilisateur.
Vous obtenez le
char * code> à l'intérieur de cette chaîne comme expliqué en détail dans ce Réponse