Quelles sont les différences entre un pointeur de variable et une variable de référence en C++?

Je sais références sont sucre syntaxique, donc le code est plus facile à lire et à écrire.

Mais quelles sont les différences?


Résumé des réponses et des liens ci-dessous:

  1. Un pointeur peut être assignée à n'importe quel nombre de fois tandis qu'une référence ne peut pas être ré-attribuée après la liaison.
  2. Pointeurs point de nulle part (NULL), tandis que la mention se réfère toujours à un objet.
  3. Vous ne pouvez pas prendre l'adresse d'une référence comme vous le pouvez avec des pointeurs.
  4. Il n'y a pas de référence de l'arithmétique" (mais vous pouvez prendre l'adresse d'un objet pointé par une référence et faire de l'arithmétique des pointeurs sur elle comme dans &obj + 5).

Pour clarifier un malentendu:

La norme C++ est très prudent pour éviter de dicter la façon dont un compilateur peut
mettre en œuvre les références, mais chaque compilateur C++ implémente
références (pointeurs. C'est, une déclaration telle que:

int &ri = i;

si c'est pas optimisé disparaître entièrement, alloue la même quantité de stockage
comme un pointeur, et place l'adresse
de i en ce stockage.

Donc, un pointeur et une référence à la fois utiliser la même quantité de mémoire.

En règle générale,

  • Utiliser des références en fonction des paramètres et types de retour pour fournir des informations utiles et l'auto-documentation des interfaces.
  • Utiliser des pointeurs pour la mise en œuvre d'algorithmes et structures de données.

Lecture intéressante:

  • Une référence locale (c'est à dire, qui n'est pas dans une structure ou une classe) n'est pas nécessairement une allocation de stockage. Vous pouvez dire à cause de la sizeof différence entre sizeof(int &) et sizeof(struct { int &x; }).
  • Je pense que le point 2 doit être "Un pointeur est autorisé à être NULLE, mais une référence n'est pas. Seulement incorrect code peut créer une référence NULL et son comportement n'est pas défini."
  • Les pointeurs sont juste un autre type d'objet, et comme n'importe quel objet en C++, il peut être une variable. Références sur l'autre main ne sont jamais des objets, seules les variables.
  • Cette compile sans mise en garde: int &x = *(int*)0; sur gcc. On peut, en effet, point à la valeur NULL.
  • Je ne suis pas sûr que je suis d'accord que "les références sont sucre syntaxique". Comment feriez-vous pour la conception de copier les constructeurs dans votre langue si vous n'avez pas de références?
  • Sans doute on pourrait prendre l'adresse de référence, comme le langage adopté dans la mise en œuvre de l'opérateur d'affectation, c'est à dire T& T::operator=(const T& rhs) { if (this == &rhs) return *this; ... }.
  • aussi utile lien
  • Je ne me sens pas qualifié pour modifier le "clarifier un malentendu" une partie de cette question, mais je pense qu'il doit être observé que si int i vit dans un registre pour l'ensemble de sa vie, la référence n'est probablement pas un pointeur, il suffit simplement de alias le même registre.
  • de référence est un alias de la variable
  • Les références ne sont pas seulement sucre syntaxique: ils sont TOUJOURS dans un état. Ceci est renforcé par le compilateur. Les pointeurs ont pas cette garantie.
  • J'aime la façon dont la première phrase est une totale illusion. Les références ont leur propre sémantique.
  • Non, ce n'est pas correct. C'est une référence à ce que l'emplacement de la mémoire. La référence elle-même est valide. Accéder à ce qu'il y a bien - n'est pas défini.
  • bien sûr, pour y arriver, vous déréférencé un pointeur null. . .qui est lui-même défini. . .
  • Cette question montre l'arithmétique des pointeurs être fait sur une référence ("&obj + 5"). N'est-ce pas briser aliasing hypothèses, où le site d'appel suppose qu'une fonction appelée ne va pas faire un tel calcul. Ainsi, la signification de référence de l'arithmétique est UB?
  • Pointeur fondamentalement stocke l'adresse de son pointee.
  • int *p = NULL; int &r=*p; référence vers NULL; if(r){} -> boOm 😉
  • Non, que prend l'adresse de la référence de la cible. Lire de nouveau: Une référence est un alias vers un autre objet. (Sauf au stade de la création,) sa sémantique est entièrement identique à si vous avez utilisé le nom d'origine.
  • Je ne dirais pas que les références sont mis en œuvre comme les pointeurs en C++, ils sont deux différentes abstractions pour l'adresse d'un objet. Penser comment le matériel fonctionne: dans le matériel, vous n'avez pas de "pointeurs", vous avez les registres, la mémoire et les instructions qu'ils opèrent sur les registres et la mémoire.
  • J'aime à imaginer que les variables sont des gens lors d'une fête, puis un pointeur est quelqu'un qui va autour de leur doigt normalement destiné à quelqu'un d'autre et qui c'est peut être changé et, dans certains cas, le quelqu'un d'autre qui quitte la partie et ne peut plus se faire remarquer (hors de portée) ou assassiné (détruit, c'est un mauvais parti!), en d'autres occasions, le pointeur de la personne peut être fait le point d'une nouvelle personne (valeur modifiée) ou le sol (à 0, nullptr etc.). En comparaison, une variable de référence est un nouveau nom insigne qu'une personne peut mettre sur eux-mêmes (dont un pointeur peut utiliser aussi bien!)
  • a pointer and a reference both occupy the same amount of memory - ce qui est faux. Pointeur vers une fonction virtuelle peut occuper plus de mémoire qu'une référence.
  • Suis-je le seul qui pense que les pointeurs sont plus faciles à lire et ils permettent de préciser le code plus de références?
  • Un point très important: le programmeur doit gérer la mémoire de pointeurs, mais pas de références.
  • Un pointeur peut être nulle, c'est à dire assumer une valeur qui n'est manifestement pas le point de tout objet ou de la fonction. D'autre part, une référence null ne peut pas exister dans un programme bien défini, parce que la seule façon de créer une telle référence serait de le lier à l'objet ou la fonction obtenue par un déréférencement d'un pointeur null, ce qui provoque un comportement indéfini.
  • De référence ne peut pas être réinstaller. A A, c; A& b = a; b=c ne fonctionnera pas.
  • pas de travail" en fait cela dépend de ce que vous pensez que le code pour le faire
  • fbb-git.github.io/cppannotations/cppannotations/html/... Peut-être d'intérêt trop et aussi, éventuellement, fbb-git.github.io/cppannotations/cppannotations/html/... - Le C++ Annotations qui est utile pour les programmeurs C - pour ce qu'il pourrait être intéressant est peut-être d'intérêt pour certaines. Personnellement j'ai eu plusieurs très mauvaises réactions à C++ - le look est inesthétique pour moi, au plus haut degré, et c'est seulement une question de beaucoup d'autres ... donc je ne vais pas être en mesure d'ajouter plus de liens, mais ils sont peut-être utile ou intéressant pour certains.
  • Avec l'accent mis sur la mise en œuvre, étant donné que les compilateurs de mettre en œuvre des références comme pure pointeurs, références sont juste différentes syntaxique d'objet dans la langue avec des propriétés différentes que des pointeurs dans la langue. Est-ce exact?
  • Vous êtes à la référence à null, et ce qui est interdit par les règles de la langue. Ainsi, vous POUVEZ utiliser une référence nulle, de la même façon, vous POUVEZ tuer des gens: vous ne devriez pas. Vous pouvez également modifier une valeur de référence étant donné que vous casser la pile où la variable réside...
  • Pas de. Les pointeurs occupe toujours la même (sauf si vous avez de PRÈS et de LOIN pointeurs comme 16 bits de code sur un 8086). La classe virtuelle est un supplément de pointeur (il occupe un peu plus), mais la taille du pointeur est défini par matériel et toujours le même, quel qu'il points de, généralement de la taille de l'architecture (32 bits (x86; 64 bits sur x86_64).
  • Je parlais de la mise en œuvre en C++, pas sur le matériel/os de la conception. Je veux dire que sizeof de pointeur de fonction et sizeof de méthode virtuelle pointeur sera différent.
  • Ils ne sont pas différents à tous. Le fait qu'une fonction est virtuelle ajoute une couche d'indirection, mais n'augmente pas la taille du pointeur. Et la mise en œuvre est toujours très attaché à ce que le matériel n'en bas (la taille du pointeur est donné par le MATÉRIEL). godbolt.org/z/BgXbPc
  • Je parlais de ceci: static_assert(sizeof(&Polymorphic::polymethod) == 2*sizeof(void*), "Error in size");. L'anglais n'est pas ma langue maternelle, peut-être que j'ai mal compris quelque chose.
  • Ni ma langue maternelle, mais le fait est que sizeof(&Polymorphic::polymethod) == 2*sizeof(void*) mais aussi sizeof(&Base::method) == 2*sizeof(void*). Il n'a rien à voir avec le polymorphisme, c'est que les fonctions de membre d'objets nécessitent plus de taille, car ils ne sont pas "juste des pointeurs" barbante langue astuces que vous en penser.

InformationsquelleAutor prakash | 2008-09-11