用函数表示c ++中的引用

时间:2015-10-16 02:09:17

标签: c++ c++11

有没有人可以详细说明此代码中的引用行为,为什么它在第一行而不是11行打印12。

以下是代码

http://ideone.com/l9qaBp

#include <cstdio>
using namespace std;

int &fun()
{
    static int x = 10;
    x++;
    return x;
}

int main()
{
    int *ptr=&fun();
    int *ptr1=&fun();
    printf("%p  %p \t %d  %d",(void*)ptr,(void*)ptr1,*ptr,*ptr1);
    return 0;
}

代码的输出是

134519132 134519132 12 12

请解释为什么 12 在第一次通话时打印 11 我明白第二次通话时应该打印12

4 个答案:

答案 0 :(得分:4)

ptrptr1指向同一个变量static int x。第二次调用将static int x的值更改为12,然后根据derefernce ptrptr1打印出该值,同样的结果将打印出来。

答案 1 :(得分:3)

fun()返回的int引用对于两个调用都是相同的(引用静态x),因此两个调用的引用地址相同。因此,相同地址的所得取消引用是当前相同的值。

答案 2 :(得分:2)

您的错误似乎是在printf()打印*ptr时尽快打印出来。它不是;在计算printf()ptr之前,不会调用ptr1。由于ptrptr1都指向相同的内存位置(这是一个静态变量),并且在第一次调用fun() 之后该位置都会更新第二,地址保留了该值。

答案 3 :(得分:0)

static个变量具有生命周期范围,并存储在静态分配的内存中。这意味着函数内的static局部变量的存储不会在调用堆栈上分配和释放。

在编译时初始化x后,x的值将保存在函数fun的调用之间。

当C ++语句按顺序执行时,printf将在给定行中调用两个函数调用后执行

int *ptr=&fun();
int *ptr1=&fun(); 

因此x的值在执行12语句之前将为printf

请记住

int *ptr=&fun();
int *ptr1=&fun(); 

不等于

int& (*ptr)() = &fun;
int& (*ptr1)() = &fun;    

第二个代码段ptrptr1都保存了函数fun的地址。在这种情况下,您需要直接调用函数或使用这些指针作为

int a = ptr();
int b = ptr1();

ab的调用值之后

将为12