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


    错误示范

    #include 
    using namespace std;
    
    int* RetPtr(void) {							//函数返回指针类型
    	int tempData1 = 1;					//函数执行完后,这个变量的生命周期结束,变量的内存被系统收回
    	cout << "第一个函数中值的地址为:" << &tempData1 << endl;
    	//Output:第一个函数中值的地址为:008FFD9C
    
    	return &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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    正确解决办法

    #include 
    using namespace std;
    
    int& RetQuote(void) {						//函数返回引用类型
    	int tempData2 = 2;
    	cout << "第二个函数中值的地址为" << &tempData2 << endl;
    	//Output:00D6FDE4
    	return tempData2;
    }
    int main(void) {
    	int copyTempData;
    	copyTempData = RetQuote();						//强行拿 整形变量 接收 引用类型的返回值
    	cout << "tempData2的值:" << copyTempData << endl;
    	//Output:tempData2的值:2
    
    	cout << "对copyTempData引用(看看是不是tempData2的地址值):" << &copyTempData << endl;
    	//对copyTempData引用(看看是不是tempData2的地址值):00D6FEC8
    
    	/* 分析 ©TempData != &tempData2 的原因
    	“int copyTempData;”				:	为新变量copyTempData 开辟一个新的空间
    	“copyTempData = RetQuote();”	:	copyTempData = tempData2;//这是个伪代码
    	*/
    	
    	cout << "对copyTempData进行修改后的值:" << copyTempData + 10 << endl;
    	//对copyTempData进行修改后的值:12
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    机器学习数据挖掘十大经典算法 数学建模常用算法
    【Python&语义分割】Segment Anything(SAM)模型全局语义分割代码+掩膜保存(二)
    编译rk3588_buildroot报错
    工程竣工决算审计不同于竣工结算审核的十大要点
    一步一招,教你如何制作出成功的优惠促销微传单
    【前端】web移动端进行监控是否完播 | 视频完播率设计
    Web前端vueDemo—实现天气预报功能(四)
    电动汽车充放电V2G模型MATLAB代码
    sql语句,分组后,组内根据datetime字段排序,保留日期最新的一条组内记录,删除其他项。(用于组内重复数据的剔除)
    双十二购买护眼台灯亮度多少合适?灯光亮度多少对眼睛比较好呢
  • 原文地址:https://blog.csdn.net/qq_73928885/article/details/134090560