2

我的印象是对取消引用指针的引用地址与指针的地址相同(所以在这里提问)。

但是当我编写一个返回取消引用指针引用的函数时,我得到的地址与原始地址不同:

#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

该函数是创建一个临时变量并返回它的地址还是什么?我不太明白它为什么会这样做。

4

3 回答 3

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;
于 2013-05-03T16:47:06.357 回答
2

getSecond可能会返回对 的第二个元素的引用buff,但随后将其复制到变量中second

int second = getSecond();

所以当你这样做时&second,你会得到 的地址second,而不是buff元素的地址。

您还需要second参考,以获得您期望的输出:

int& second = getSecond();
于 2013-05-03T16:47:18.140 回答
2

函数是否创建临时变量

不,正在创建一个:

int second = getSecond();

应该

int &second = getSecond();
于 2013-05-03T16:48:08.860 回答