一、函数返回 静态变量 / 全局变量 的 引用 / 指针
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_WorkSpace 02_VSHelloWorldHelloWorldDebugHelloWorld.exe (进程 13496)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .