Comment obtenir un pointeur à partir d’une référence?

Il semble y avoir beaucoup de questions reliques sur le pointeur contre la référence, mais je ne pouvais pas trouver ce que je voulais savoir. Fondamentalement, un object est passé par une référence:

funcA(MyObject &objRef) { ... } 

Dans la fonction, puis-je obtenir un pointeur sur cet object au lieu de la référence? Si je traite la référence objRef comme un alias de MyObject , est-ce que &objRef me donnerait un pointeur sur MyObject? Cela ne semble pas probable. Je suis confus.

Edit: Après un examen plus approfondi, objRef me redonne le pointeur sur l’object dont j’ai besoin – La plupart d’entre vous m’avez donné des informations / réponses correctes, merci beaucoup. J’ai suivi la réponse qui semble être la plus illustrative dans ce cas.

Oui, appliquer l’adresse de l’opérateur à la référence revient à prendre l’adresse de l’object d’origine.

 #include  struct foo {}; void bar( const foo& obj ) { std::cout << &obj << std::endl; } int main() { foo obj; std::cout << &obj << std::endl; bar( obj ); return 0; } 

Résultat:

 0x22ff1f 0x22ff1f 

Tout opérateur appliqué à une référence s’appliquera réellement à l’object auquel il se réfère ( §5 / 5 [expr] ); la référence peut être considérée comme un autre nom pour le même object. Prendre l’adresse d’une référence vous donnera donc l’adresse de l’object auquel il se réfère.

Il est en fait non spécifié si une référence nécessite ou non un stockage ( §8.3.2 / 4 [dcl.ref] ) et il ne serait donc pas judicieux de prendre l’adresse de la référence elle-même.

Par exemple:

 int x = 5; int& y = x; int* xp = &x; int* yp = &y; 

Dans l’exemple ci-dessus, xp et yp sont égaux – c’est-à-dire que l’expression xp == yp évaluée à true car ils pointent tous deux vers le même object.

La solution générale consiste à utiliser std::addressof , comme dans:

 #include  void foo(T & x) { T * p = std::addressof(x); } 

Cela fonctionne peu importe si T surcharge l’ operator& ou non.

Utilisez l’adresse de l’opérateur ( & ) sur la référence.

 &objRef 

Comme tout autre opérateur utilisé sur une référence, cela affecte réellement l’object référencé.

Comme @Kerrek le fait remarquer, puisque l’opérateur affecte l’object référencé, si cet object a un operator& fonction surchargé, cela l’appelera à la place et std::address_of est nécessaire pour obtenir l’adresse réelle.

Utilisez l’opérateur d’adresse sur la référence.

 MyObject *ptr = &objRef; 

En C ++, une référence est un type de pointeur restreint. Il ne peut être affecté qu’une seule fois et ne peut jamais avoir de valeur NULL. Les références sont plus utiles lorsqu’elles sont utilisées pour indiquer qu’un paramètre à une fonction est transmis par référence où l’adresse de la variable est transmise. Sans référence, la valeur par défaut est utilisée à la place.