Je regarde du code C ++ qui implique des adresses et rencontré certaines lignes que je ne comprends pas. Le code fonctionne comme prévu, mais je ne comprends pas la ligne où la variable X est attribuée à l'adresse de R. Ma compréhension est que ce serait une erreur puisque vous serez Affectation de la valeur stockée dans x à une adresse. Comment se fait-il que la ligne qui est commentée renvoie une erreur? P> p>
3 Réponses :
Je ne comprends pas la ligne où la variable X est attribuée à la adresse de r p>
xxx pré> La ligne ci-dessus déclare un
référence-to-int code> nommér code>, et le fait référence à la variable déjà existantex code>. C'est dans n'importe quel code dans la fonction sous la ligne ci-dessous,r code> sera un alias pourx code>. p>xxx pré> La ligne ci-dessus (quand il est non motivé) produit une erreur car la valeur du côté droit du
= code> est de typeint * code> (c'est-à-dire qu'il est un pointeur-to-an-int ), tandis que la valeur du côté gauche du= code> est de typeint & code> (c'est-à-dire que c'est une référence-to-an-int). p>Dans les références C ++ Loi comme des pointeurs d'une certaine manière, mais en ce qui concerne leur syntaxe, ils suivent principalement les mêmes règles que le type à laquelle ils se réfèrent - ceci est parce qu'ils agissent comme des alias à une valeur de ce type. Donc, dans ce cas, comme vous ne pouvez pas affecter un pointeur à un
int code>, vous ne pouvez pas affecter un pointeur à unint & code> soit: p> < Pré> xxx pré> blockQuote>
Je ne comprends pas la ligne où la variable X est attribuée à l'adresse de r p> blockQuote>
La syntaxe de C ++ peut être déroutante ici, mais ce que vous voyez n'est pas une variable attribuée à une adresse. P>
Ici, l'ampersand a une signification différente:
r code> est une variable de typeint & code>, c'est-à-dire un Référence à un int. Cela ne signifie pas "Prendre l'adresse de R". Ce que cela signifie, plus ou moins, est quer code> est maintenant un alias dex code>. Il se comporte comme unint code>, pas comme unint * code> (pointeur sur int). Si vous imprimez leur valeur, vous constaterez que c'est la même chose, et si vous en changez l'un d'entre eux, vous modifierez également l'autre. P>Vous pouvez regarder cette question pour une explication complète des références. P>
Un moyen de regarder Il est de déplacer le panneau de référence de à p> il doit échouer - car mais vous pouvez assigner em> quelque chose à quel que soit ... Tant que la valeur r code > est un int & code> - une référence IT un int code>, ce qui signifie que r code> ne libérera pas la mémoire allouée par x code > Lorsque r code> est hors de portée, mais ce sera une référence à x code> tandis que x code> vit. r code> est déclaré par la présente et sa déclaration ne peut pas changer, donc si vous essayez: p> r code > est déjà déclaré. p> r code> est une référence à p> code> type em> est convertible sur le type référencé par r code> (0-1 opérateurs de conversion). p> p>
Vous ne pouvez pas déclarer plus d'une fois. R est une référence à x déjà.
R est une référence, pas un pointeur. Pensez à des références comme des pointeurs où vous n'avez pas besoin d'utiliser explicitement
& code> ou* code>.Dans ce contexte (déclaration / définition), le
& code> s'applique auint code> de gauche non ler code> et il forme un type de composé i> appelé "INT référence".Note côté:
int * r = & x; code> feraitr code> un pointeur surint code> et capable d'accepter de stocker l'adresse d'unint code> (sans sauter à travers des cerceaux, je ne recommande généralement pas)Le
& code> a deux b> différentes significations. Apprenez la différence et tout ira bien.