C ++:为什么我的函数返回的参考地址与解除引用的指针的地址不同?

时间:2013-05-03 16:44:43

标签: c++ pointers reference

我的印象是,对解除引用的指针的引用地址与指针的地址(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

该函数是否创建临时变量并返回其地址或其他内容?我无法弄清楚为什么会这样做。

3 个答案:

答案 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();