web-dev-qa-db-fra.com

Existe-t-il un moyen de trouver l'adresse d'une référence?

Existe-t-il un moyen de trouver l'adresse d'une référence?

Pour le rendre plus spécifique: l'adresse de la variable elle-même et non l'adresse de la variable avec laquelle elle est initialisée.

59
Sandeep

Les références n'ont pas leurs propres adresses. Bien que les références puissent être implémentées en tant que pointeurs, cela n'est ni nécessaire ni garanti.

La FAQ C++ le dit le mieux:

Contrairement à un pointeur, une fois qu'une référence est liée à un objet, elle ne peut pas être "réinstallée" sur un autre objet. La référence elle-même n'est pas un objet (elle n'a pas d'identité; prendre l'adresse d'une référence vous donne l'adresse du référent; rappelez-vous: la référence est son référent).

Veuillez également voir ma réponse ici pour un liste complète de la façon dont les références diffèrent des pointeurs .

La référence est son référent

59
Brian R. Bondy

NON . Il n'y a aucun moyen d'obtenir l'adresse d'une référence.
C'est parce qu'une référence n'est pas un objet, c'est un alias (cela signifie que c'est un autre nom pour un objet).

int  x = 5;
int& y = x;

std::cout << &x << " : " << &y << "\n";

Cela imprimera la même adresse.
En effet, "y" n'est qu'un autre nom (un alias) pour l'objet "x".

35
Martin York

La norme ISO le dit le mieux:

Il ne doit y avoir aucune référence à des références, aucun tableau de références et aucun pointeur vers des références.

Je n'aime pas la logique que beaucoup de gens utilisent ici, que vous ne pouvez pas le faire parce que la référence n'est pas "garantie d'être juste un pointeur quelque part de toute façon." Tout comme int x n'est peut-être qu'un registre de processeur sans adresse, mais devient par magie un emplacement de mémoire lorsque & x est utilisé, le compilateur peut toujours autoriser ce que vous voulez.

Dans le passé, de nombreux compilateurs permettaient exactement ce que vous demandez, par exemple

int x, y;
int &r = x;
&r = &y; // use address as an lvalue; assign a new referent

Je viens de vérifier et GCC va le compiler, mais avec un avertissement fortement formulé, et le programme résultant est cassé.

22
Potatoswatter

Non.

Comme le dit Bjarne Stroustrup dans TC++ PL, une référence peut être considérée comme simplement un autre nom pour une entité existante (objet ou fonction). Bien que ce ne soit pas toujours la description la plus précise du mécanisme de bas niveau sous-jacent qui implémente les références, c'est une très bonne description du concept que les références sont censées implémenter au niveau du langage. Sans surprise, la langue ne fournit aucun moyen d'obtenir l'adresse de référence elle-même.

Au niveau de la langue, la référence n'est pas garantie d'occuper une place de stockage, et donc en général elle n'a pas d'adresse.

12
AnT

D'un autre exemple de cette même question: $ 8.3.2/3 - "Il n'est pas spécifié si une référence nécessite ou non un stockage (3.7).".

Ainsi, la norme C++ permet au compilateur/implémenteur d'exécution de choisir si une référence réside ou non dans un emplacement mémoire distinct. Cependant, notez que s'il réside dans un emplacement de mémoire distinct, vous ne pouvez pas trouver son adresse de manière conforme aux normes. Alors ne le fais pas.

Si vous prenez l'adresse d'une référence, par définition dans la norme C++, vous obtiendrez l'adresse de ce à quoi elle se réfère, plutôt que l'adresse de la référence, si en fait cette référence existe même en tant qu'entité distincte dans l'environnement d'exécution ou pas.

9
Ben Mesander

Utilisez simplement l'opérateur '&'. par exemple :

int x = 3;
int &y = x;
cout<<&y<<endl;

Cela renverra l'adresse de x puisque y n'est rien de plus que l'adresse de x.

7
Jesse Emond

Pas de manière fiable, car les références n'ont pas besoin d'avoir un emplacement unique dans la mémoire adressable.

4
Drew Dormann

Pas tout seul. Si vous voulez son "adresse", placez-le dans une structure ou une classe. Même alors, cela n'est pas nécessairement garanti pour vous mettre à proximité de ce que vous voulez probablement faire, à savoir utiliser un pointeur. Si vous voulez une preuve, la taille d'une référence est égale au type de référent. Essayez-le avec char & et voyez.

2
MSN

C'est possible, mais pas strictement en C++. Puisque la référence est passée en tant que paramètre d'une fonction, sa valeur sera stockée sur la pile ou dans un registre. Cela dépend de l'architecture matérielle. L'accès à ces valeurs nécessitera un assemblage en ligne. Consultez le manuel de référence du processeur que vous utilisez pour déterminer le comportement de la pile et enregistrer les adresses. La corruption de la pile ou des registres peut très facilement provoquer un BSOD, une perte de données ou même des dommages permanents à votre système. Procéder à une extrême mise en garde.

1
Jim Fell