我的印象是,对解除引用的指针的引用地址与指针的地址(so question here)相同。
但是当我编写一个返回解除引用指针的引用的函数时,我得到的是与原始地址不同的地址:
#include <iostream>
using namespace std;
int buff[10] = {0};
int& getSecond();
int main(){
buff[0] = 5;
buff[1] = 10;
buff[2] = 15;
int second = getSecond();
int* sp = (int*)&second;
cout << "second:" << *sp << " third?" << *(sp+1) << endl;
cout << "second:" << *(buff + 1) << " third: " << *(buff + 2) << endl;
cout << "Buff " << *buff << " addr:" << &(*buff) << " reffy: " << &second << endl;
}
int& getSecond(){
return *(buff + 1);
}
我从中获得的输出是:
second:10 third?-16121856
second:10 third: 15
Buff 5 addr:0x8050b80 reffy: 0xbf7089b0
该函数是否创建临时变量并返回其地址或其他内容?我无法弄清楚为什么会这样做。
答案 0 :(得分:4)
您创建了一个名为second
的变量,该变量将被赋予getSecond()
返回的值。如果我理解你的问题,你或许打算写:
int& second = getSecond();
// ^
// Mind the reference symbol
这样,second
实际上是对buff
的第二个元素的引用,而不是具有自己地址的单独变量,以及初始化:
int* sp = (int*)&second;
// ^^^^^^
// By the way, this is not necessary!
会使sp
指向buff
的第二个元素(这似乎是您所期望的),而不是指向名为second
的单独变量。正如评论中所提到的(感谢DyP注意到),演员阵容是多余的(你不应该使用C风格的演员表),所以你应该重写它:
int* sp = &second;
答案 1 :(得分:2)
getSecond
可能会返回对buff
的第二个元素的引用,但您会将其复制到变量second
中:
int second = getSecond();
因此,当您执行&second
时,您会获得second
的地址,而不是buff
元素的地址。
您也需要将second
作为参考,以获得您期望的输出:
int& second = getSecond();
答案 2 :(得分:2)
该函数是否创建临时变量
不,你正在创建一个:
int second = getSecond();
应该是
int &second = getSecond();