【C++指针】函数返回指针类型 与 函数返回引用类型(关于获取局部变量的操作)

news/2024/12/23 1:24:59/

错误示范

#include <bits/stdc++.h>
using namespace std;int* RetPtr(void) {							//函数返回指针类型int tempData1 = 1;					//函数执行完后,这个变量的生命周期结束,变量的内存被系统收回cout << "第一个函数中值的地址为:" << &tempData1 << endl;//Output:第一个函数中值的地址为:008FFD9Creturn &tempData1;					//返回这个局部变量的地址(地址即指针)
}int& RetQuote(void) {						//函数返回引用类型int tempData2 = 2;cout << "第二个函数中值的地址为" << &tempData2 << endl;return tempData2;
}int main(void) {int* getP;								//指针可以不初始化,暂时作为为野指针getP = RetPtr();						//指针类型的变量接收指针类型的返回值cout << "tempData1的值为:" << *getP << endl;// 1-1//Output:tempData1的值为:1/* 1-1 这句代码很玄学:虽说 第一个函数 确实可以返回一个 地址值(即在 函数调用期间 存放 tempData1这个局部变量 的地址),(在函数执行完后,tempData1这个局部变量 的内存应该被系统收回,即tempData1应该从tempData1所在的地址上消失即 tempData1所在的地址 现在应该是没存任何值的)但是 解引用这个地址还是获得了 这个局部变量的值,这就很抽象!!!同时报了个警告:warning C4172: 返回局部变量或临时变量的地址: tempData1*/cout << "再次解引用" << *getP << endl;// 2-1//Output:2040637688/* 分析 2-1 这句代码的结果显然,这个值是有问题的,说明在 1-1代码结束 tempData1 的生命周期才结束*/cout << "对 tempData1 进行修改后的值:" << (*getP)+10 << endl;// 2-2//Output:对 tempData1 进行修改后的值:2040637698/* 分析 2-2 这句代码的结果2-1这句代码 如果替换成 2-2这句代码 ,效果一样,也会返回一个很奇怪的值*//* 针对 1-1 2-1 2-2 这三句代码得出结论:在函数被调用,执行完后,函数局部(里) 定义的 变量仍会存在一定时间*/cout << "tempData1的地址(指针)值:" << getP << endl;		//对地址(指针)的解引用,获得指针所指对象的值//Output:tempData1(指针)值:008FFD9C,和tempData1的地址值一样,说明 RetPtr() 确实返回了tempData1的地址值/*所以不建议使用 “函数返回指针” 来获取 函数中使用的局部变量!!!*//*下面这种也是不可行的*///int& getQ;							//这样写是错的int& getQ = RetQuote();					//引用类型的变量必须初始化cout << "tempData2的值为:" << getQ << endl;/* 和第一种一样的情况还是获得了局部变量的值*/cout << "再次获得tempData2的值:" << getQ << endl;/* 和第一种一样的情况无法获取这个值,即地址上的值已经消失了*/return 0;
}

正确解决办法

#include <bits/stdc++.h>
using namespace std;int& RetQuote(void) {						//函数返回引用类型int tempData2 = 2;cout << "第二个函数中值的地址为" << &tempData2 << endl;//Output:00D6FDE4return tempData2;
}
int main(void) {int copyTempData;copyTempData = RetQuote();						//强行拿 整形变量 接收 引用类型的返回值cout << "tempData2的值:" << copyTempData << endl;//Output:tempData2的值:2cout << "对copyTempData引用(看看是不是tempData2的地址值):" << &copyTempData << endl;//对copyTempData引用(看看是不是tempData2的地址值):00D6FEC8/* 分析 &copyTempData != &tempData2 的原因“int copyTempData;”				:	为新变量copyTempData 开辟一个新的空间“copyTempData = RetQuote();”	:	copyTempData = tempData2;//这是个伪代码*/cout << "对copyTempData进行修改后的值:" << copyTempData + 10 << endl;//对copyTempData进行修改后的值:12return 0;
}

http://www.ppmy.cn/news/1187768.html

相关文章

【base64加密】js/ts的基础加密

base64的字符串简单加密&#xff0c;主用于网页缓存数据的加密。 适用于常规html、小游戏&#xff08;egret、cocos、laya&#xff09;等 原文参考&#xff1a;JS基于base64编码加密解密文本和图片&#xff08;修订&#xff09;_js base64加密-CSDN博客 测试&#xff1a;JS实…

使用logback按天生成日志并按等级进行分类

先看效果---->>>> 按照&#xff1a;error、info、warn进行分类&#xff1a; 每个文件里面按日期进行分类&#xff1a; 其中对应的Maven如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

新建包含cuda和cudnn的docker

背景&#xff1a;服务器的cudnn版本太低了&#xff0c;没有权限去修改。故新建包含cuda和cudnn的docker 步骤 一、拉取镜像及创建docker 拉取相关的镜像 从镜像列表选出相关版本的镜像https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md …

豪车托运为什么选小板

小板运输是一种适用于豪车客户的高效运输方式。它提供了快速、安全、便捷的服务&#xff0c;并且相对经济实惠。以下是关于小板运输的时效和价格的介绍&#xff1a; 时效&#xff1a;小板运输通常能够在短时间内完成车辆的运输。具体时效取决于起点和目的地之间的距离&#xff…

Hi3516DV500部署paddle版型分析模型记录

原版模型测试并导出onnx paddle 版面分析-> https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/layout/README_ch.md 测试 python3 deploy/python/infer.py \ --model_dirmodel/picodet_lcnet_x1_0_fgd_layout_cdla_infer/ \ --image_fil…

C语言数据结构-----顺序表(多功能动态顺序表的代码实现)

前言 本篇讲述了顺序表的相关知识&#xff0c;以及动态顺序表的代码实现。 文章目录 前言1.线性表2.顺序表2.1 静态顺序表2.2 动态顺序表 3动态顺序表代码详解3.1 顺序表功能(头文件)3.2 各功能函数3.2.1 初始化顺序表3.2.2 摧毁顺序表3.2.3 打印顺序表3.2.4 检测顺序表的容量…

IDEA优雅自动生成类注释和快捷键生成方法注释

生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板&#xff1a; /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…

【申博榜单好刊】1区TOP,IF18.6,1个月22天录用,4天见刊!(国人友好)

计算机领域 • 好刊解读 今天小编带来Elsevier旗下计算机领域好刊的解读&#xff0c;如有相关领域作者有意向投稿&#xff0c;可作为重点关注&#xff01;后文有同领域快刊发表案例&#xff0c;供您投稿参考~ 01 期刊简介 Information Fusion ☑️出版社&#xff1a;Elsevie…