错误示范
#include <bits/stdc++.h>
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;
}
正确解决办法
#include <bits/stdc++.h>
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的地址值):" << ©TempData << endl;
//对copyTempData引用(看看是不是tempData2的地址值):00D6FEC8
/* 分析 ©TempData != &tempData2 的原因
“int copyTempData;” : 为新变量copyTempData 开辟一个新的空间
“copyTempData = RetQuote();” : copyTempData = tempData2;//这是个伪代码
*/
cout << "对copyTempData进行修改后的值:" << copyTempData + 10 << endl;
//对copyTempData进行修改后的值:12
return 0;
}