C++ 有没有办法找到推荐人的地址?

C++ 有没有办法找到推荐人的地址?,c++,reference,C++,Reference,有没有办法找到推荐人的地址 使其更具体:变量本身的地址,而不是初始化变量的地址。只需使用“&”运算符即可。 e、 g: intx=3; int&y=x; 不可靠,因为引用不必在可寻址内存中有唯一的位置。引用没有自己的地址。尽管引用可以实现为指针,但不需要也不保证这一点 说得最好的是: 与指针不同,一旦引用 绑定到一个对象,它不能被 “重置”到另一个对象。这个 引用本身不是一个对象(它是 没有身份;使用的地址是 推荐人给你的地址是 指代物;记住:指代物 是它的参照物) 请在这里查看我的答案 引用是

有没有办法找到推荐人的地址

使其更具体:变量本身的地址,而不是初始化变量的地址。

只需使用“&”运算符即可。 e、 g:

intx=3;
int&y=x;

不可靠,因为引用不必在可寻址内存中有唯一的位置。

引用没有自己的地址。尽管引用可以实现为指针,但不需要也不保证这一点

说得最好的是:

与指针不同,一旦引用 绑定到一个对象,它不能被 “重置”到另一个对象。这个 引用本身不是一个对象(它是 没有身份;使用的地址是 推荐人给你的地址是 指代物;记住:指代物 是它的参照物)

请在这里查看我的答案

引用是其引用对象

正如Bjarne Stroustrup在TC++PL中所说,引用可以被看作是现有实体(对象或函数)的另一个名称。虽然这并不总是对实现引用的底层底层机制的最精确描述,但它很好地描述了引用打算在语言级别实现的概念。毫不奇怪,语言本身没有提供获取引用地址的手段


在语言级别上,引用不能保证占用存储空间,因此在一般情况下,它没有地址。

ISO标准最好说明:

不应有对引用的引用、引用数组和引用指针

我不喜欢很多人在这里使用的逻辑,你不能这样做,因为引用“无论如何都不能保证只是某个地方的指针”。正如
int x
可能只是一个没有地址的处理器寄存器,但当使用
&x
时,它会神奇地变成一个内存位置,编译器仍然可能允许您所需的内容

在过去,许多编译器确实允许您所要求的内容,例如

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

我刚刚检查过,GCC将编译它,但是带有一个措辞强烈的警告,结果程序被破坏了。

不是它自己。如果您想要它的“地址”,请将它放入结构或类中。即使这样,也不一定能保证让你接近你可能想做的事情,那就是使用指针。如果需要证明,则引用的sizeof等于referent类型。用char试试看

。无法获取引用人的地址。
这是因为引用不是对象,而是别名(这意味着它是对象的另一个名称)

intx=5;
int&y=x;

std::cout来自同一问题的另一个实例:$8.3.2/3-“未指定引用是否需要存储(3.7)。”

> C++标准允许编译器/运行时实现者选择引用是否存在于单独的内存位置。但是请注意,如果它确实位于单独的内存位置,则无法以符合标准的方式找到它的地址。所以不要这样做


如果你引用一个引用的地址,根据C++标准中的定义,如果它在运行时环境中甚至是作为一个单独的实体存在,那么你将得到C++所引用的地址,而不是引用的地址。由于引用是作为函数的参数传递的,因此其值将存储在堆栈或寄存器中。这取决于硬件体系结构。访问这些值需要内联程序集。请参阅用于确定堆栈行为和寄存器地址的处理器的参考手册损坏堆栈或寄存器很容易导致BSOD、数据丢失,甚至对系统造成永久性损坏。请格外小心。

如果将引用实现为结构的成员,则可以获取其地址:

struct TestRef{
  int& r;
  int i;
  TestRef(int& ref): r(ref){
  }
};
引用实际上是一个指针(在我的例子中使用Xcode编译器),您可以更新它的值以将引用重新分配给新变量。 要做到这一点,我们需要找出引用的地址,并将它的值欺骗到其他变量的地址

现在,引用TestRef.r的地址就是TestRef对象的地址,因为r是TestRef的第一个成员

您可以通过更新TestRef.r内存中的值存储来重新分配引用

下面的代码显示,您可以获取引用地址,然后将引用重新分配给差异变量。注意:我的操作系统是X64操作系统(我使用Xcode MacBook Pro 2015,MacOs 10.15.1)

#包括
使用名称空间std;
结构TestRef{
国际与r;
int i;
TestRef(int&ref):r(ref){}
};
int main(int argc,const char*argv[]{
int i=10;
int j=11;
TestRef r(i);//r.r是对i的引用

我能不能认为Sandeep是指引用的地址本身,它将有效地打印出x的地址(因为y是引用,只是x的另一个名称).是的,我不确定他/她指的是参考资料所指的地址还是参考资料本身,所以我发布了这个答案以防万一。但是,参考资料不就是它所指的地址吗?所以参考资料的地址应该是“x”的地址在我的例子中?我只是想知道。:)哦,引用只是对象的别名(替代名称)。它没有自己的存储单元。@Sandeep:“指针有自己的地址”.正确。这是因为指针是一个单独的变量,包含它指向的变量的地址。在引用的情况下,没有单独的变量。引用只是被引用变量的另一个名称。获取引用的地址将只返回变量的地址
int  x = 5;
int& y = x;

std::cout << &x << " : " << &y << "\n";
struct TestRef{
  int& r;
  int i;
  TestRef(int& ref): r(ref){
  }
};
#include <iostream>
using namespace std;

struct TestRef{
  int& r;
  int i;
  TestRef(int& ref): r(ref){}
};

int main(int argc, const char * argv[]) {
  int i = 10;
  int j = 11;
  TestRef r(i); // r.r is reference to i

  cout << r.r << " " << i << " " << j << endl; // Output: 10 10 11

  int64_t* p = (int64_t*)&r; // int32_t in 32 bit OS; 
  // Note: 
  // p is the address of TestRef r and also the address of the reference r.r
  // *p is the address of i variable
  //
  // Difficult to understand? r.r indeed a pointer to i variable 
  // *p will return the address inside the memory of r.r
  // that is the address of i variable
  // this statement is true: *p == &i  
  // ------>
  // now we change the value of *p to the address of j 
  // then r.r will be the reference of j instead the reference of i

  *p = (int64_t)&j;          // int32_t in 32 bit OS; 

  cout << r.r << " " << i << " " << j << endl; // Output: 11 10 11
  return 0;
}