【C++】C++ 引用详解 ④ ( 函数返回 静态变量 / 全局变量 的 引用 / 指针 )

2023-10-15 16:40:36 浏览数 (1)

一、函数返回 静态变量 / 全局变量 的 引用 / 指针

1、函数返回局部变量引用或指针无意义

上一篇博客 【C 】C 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的 “ 局部变量 “ 的引用或指针做函数返回值无意义 ) 得出如下结论 :

函数的返回值 是 “ 局部变量 “ 的 引用 或 指针 时 , 是无意义的 ;

函数 执行完毕后 , 该 函数对应的 栈内存 会被回收 , 相应的 局部变量 地址 也有没有了意义 ,

此时 , 再持有一个 函数返回的 没有意义的 引用 / 指针 , 取出的值是随机无意义的值 ;

2、函数返回静态变量/全局变量的引用或指针

函数 返回的是 " 静态变量 " 或 " 全局变量 " 的 引用 / 指针 时 , 是可以的 ;

如果 函数 的 返回值 是 静态变量 或 全局变量 的引用 ,

这两种变量 一旦分配内存后 , 在整个程序的生命周期中 , 该内存都不会被回收 ,

返回它们的 引用 / 指针 , 可以正常访问 对应 内存中的数据 ;

3、代码示例 - 函数返回静态变量/全局变量的引用或指针

在下面的代码中 ,

fun 函数作为 参照 , 返回普通的 静态变量 ;

fun2 函数 返回 静态变量 的引用 ;

上述两个函数的 静态变量 的生命周期 都是 与 程序生命周期相同的 , 只有程序结束时 , 这两个 静态变量的内存才会被回收 ;

使用 引用 接收 fun2 函数返回的引用 , 获取的是静态变量的引用地址 , 该引用对应的内存一直是有效的 , 因此可以通过该引用获取到内存中正确的 静态变量值 ;

代码示例 :

代码语言:javascript复制
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

#include <stdio.h>

// 返回静态变量
int fun()
{
    static int a = 10;
    return a;
}

// 返回引用
int& fun2()
{
    static int a = 20;
    return a;
}

int main() {

    // 使用普通变量接收变量返回值
    int a1 = fun();

    // 使用普通变量接收引用返回值
    int a2 = fun2();

    // 使用引用接收 引用返回值
    int& a3 = fun2();

    // 混淆栈内存选项
    int a4 = fun();

    // 打印上述返回结果
    printf("a1 = %d , a2 = %d , a3 = %d , a4 = %dn", a1, a2, a3, a4);

    return 0;
}

执行结果 :

代码语言:javascript复制
a1 = 10 , a2 = 20 , a3 = 20 , a4 = 10

Y:02_WorkSpace02_VSHelloWorldHelloWorldDebugHelloWorld.exe (进程 13496)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

0 人点赞