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

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

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

68566 次浏览

只要使用“ &”操作符即可。 例如:

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

这将返回 x 的地址,因为 y 仅仅是 x 的地址。

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

没有。

正如比雅尼·斯特劳斯特鲁普在 TC + + PL 中所说,引用可以被看作是现有实体(对象或函数)的另一个名称。虽然这并不总是对实现引用的底层机制的最精确描述,但它是对引用打算在语言级实现的概念的非常好的描述。毫不奇怪,语言本身没有提供获得引用地址的方法。

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

ISO 标准说得最好:

不应该有对引用的引用,不应该有引用的数组,也不应该有指向引用的指针。

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

过去,许多编译器确实允许满足您的要求,例如

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

我刚刚检查过,GCC 会编译它,但是有一个措辞强烈的警告,最终的程序会崩溃。

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

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

int  x = 5;
int& y = x;


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

这会打印出相同的地址。
这是因为‘ y’只是对象‘ x’的另一个名称(别名)。

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

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

根据 C + + 标准中的定义,如果一个引用的地址实际上作为一个独立的实体存在于执行期函式库中,那么你将得到它所引用的地址,而不是引用的地址。

这是可能的,但不严格使用 C + + 。由于引用是作为函数的参数传递的,因此它的值将存储在堆栈或寄存器中。访问这些值将需要内联汇编。请参阅用于确定堆栈行为和寄存器地址的处理器的参考手册。极度谨慎地进行。

如果你实现了一个引用作为一个结构的成员,那么你可以得到它的地址:

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)。

#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;
}

所以实际上你可以重新分配一个引用,就像黑客一样。