带有函数的 c++ 中的引用

References in c++ with function

本文关键字:引用 c++ 函数      更新时间:2023-10-16

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

下面是代码

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

ptrptr1指向同一个变量static int x。第二次调用将 static int x 的值更改为 12,然后你通过取消引用ptrptr1打印出该值,相同的结果将被打印出来。

fun(( 返回的 int 引用对于两个调用都是相同的(引用到

静态 x(,因此该引用的地址对于两个调用都是相同的。 因此,该相同地址的最终取消引用是当前相同的值。

您的错误似乎在于认为printf()一可用就会打印*ptr。它没有; 在计算ptrptr1之前,不会调用printf()。由于 ptrptr1 都指向相同的内存位置,这是一个静态变量,并且在第一次调用 fun() 和第二次调用后更新该位置,因此地址保存该值。

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

一旦x在编译时初始化,x的值就会存储在函数fun的调用之间。

由于C++语句是按顺序执行的,因此printf将在调用给定行中的两个函数调用后执行

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

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

请记住

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

不等同于

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

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

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

在此调用值之后,ab12