首页 > 编程语言 >【C++】C++ 引用详解 ④ ( 函数返回 静态变量 / 全局变量 的 引用 / 指针 )

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

时间:2023-09-07 15:37:16浏览次数:44  
标签:返回 变量 静态 C++ 引用 全局变量 指针 函数



文章目录

  • 一、函数返回 静态变量 / 全局变量 的 引用 / 指针
  • 1、函数返回局部变量引用或指针无意义
  • 2、函数返回静态变量/全局变量的引用或指针
  • 3、代码示例 - 函数返回静态变量/全局变量的引用或指针







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




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



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

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

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

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



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



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



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

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

可以正常访问 对应 内存中的数据 ;



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



在下面的代码中 ,

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

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

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

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



代码示例 :

// 导入标准 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 = %d\n", a1, a2, a3, a4);

    return 0;
}

执行结果 :

a1 = 10 , a2 = 20 , a3 = 20 , a4 = 10

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

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


标签:返回,变量,静态,C++,引用,全局变量,指针,函数
From: https://blog.51cto.com/u_14202100/7397612

相关文章

  • Uchardet C++源码编译步骤 文本编码检测命令行工具 Command line
    从官网 https://www.freedesktop.org/wiki/Software/uchardet/下载源码 https://www.freedesktop.org/software/uchardet/releases/=====================================================================================下载编译工具:Cmake和mingw64https://cmake.org......
  • cv2.error: Unknown C++ exception from OpenCV code.报错解决
    问题原因:opencv版本太高,python版本太低解决办法:打开opencv下载网站找到自己的python版本对应的opencv的版本,然后通过下面代码安装pipinstallopencv-python==4.1.2.30-ihttps://pypi.tuna.tsinghua.edu.cn/simple ......
  • 一些C++库的简要说明
    说明:1.**Boost**:提供了许多C++库,如Boost.Asio(网络和异步I/O)、Boost.Filesystem(文件系统操作)、Boost.Thread(多线程支持)、Boost.Serialization(序列化)等。用于增强C++的功能。2.**cpp2sky**:用于与SkyWalkingAPM系统集成的库,提供应用程序性能监视和分析功能。3.**cppzmq**:C++Z......
  • C++学习笔记
    ++--自增自减运算符1++ 赋值运算符,;运算符选择语句if----elseif(表达式1){代码块;//表达式1为真执行该代码块}elseif(表达式2){代码块;//表达式2为真执行该代码块的内容}else{代码块;//以上的表达式都不满足执行该代码块的内容}switch多分支语句#include<st......
  • C++语言学习10
    一、deque双端队列容器#include是下标顺序容器,它允许在首尾两端快速的插入、删除数据deque的元素不是全部相邻存储的:采用单独分配的固定大小数组的序列存储数据,以及额外的登记表(中控数组),该表中记录了所有序列的地址,这表示通过下标访问元素时必须经过两次指针解引用,vect......
  • C++的向上转型
    在C/C++中经常会发生数据类型的转换,例如将int类型的数据赋值给float类型的变量时,编译器会先把int类型的数据转换为float类型再赋值;反过来,float类型的数据在经过类型转换后也可以赋值给int类型的变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:inta=......
  • C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛
    AcWing第2场周赛竞赛-AcWing3626三元一次方程AcWing3626.三元一次方程-AcWing两层循环#include<iostream>usingnamespacestd;voidfind(intn){for(intx=0;x<=1000/3;x++){for(inty=0;y<=1000/5;y++){int......
  • C++运算符优先级
    所有(可能)运算符共分为18级。第1级运算符含义::作用域解析运算符第2级运算符含义()函数调用()值构造,即type(expr)[]数组下标->间接成员运算符.直接成员运算符const_cast专用的类型转换dynamic_cast专用的类型转换re......
  • c++中输出浮点数
    flata=1;flatb=3;cout<<a<endl;cout<<showpoint<<b<endl;ANSI C++里一个浮点型若是小数部分为0,直接输出必然是不带小数点的,例如floatb=3;你若想输出3.0,输出代码要这样写:cout << showpoint << a;......
  • C++中的虚函数重载
    在一次修改代码过程中踩的坑,下来研究了一下,发现C++中虚函数重载后会产生很多有意思的情况,在这里总结了一下。C++中有重载(overload)和重写(override)以及重定义这几个概念,1overload:指的是相同作用域中的两个函数的函数名相同,但参数列表的个数、顺序、类型不同。而override指的是子类......