关于C++函数临时变量返回值问题

#include<iostream>usingnamespacestd;int*a(intx){return&x;}intmain(){intb=3,*p=a(b);co... #include <iostream>
using namespace std;
int* a(int x){
return &x;
}
int main()
{int b=3,*p=a(b);
cout<<"*p="<<*p<<endl;
cout<<"*(a(b))="<<*(a(b))<<endl;
return 0;
}

返回指针指向的值为什么会不一样?
展开
 我来答
N_0_1
高粉答主

2015-10-31 · 关注我不会让你失望
知道大有可为答主
回答量:8628
采纳率:47%
帮助的人:837万
展开全部
临时变量,说到这个词很多开发的人应该都知道,但是却有很多人并不是真正具体的理解临时变量,很多人提到临时变量想到的都是我们在一个函数中自己临时创建的变量,我们认为那个我们临时创建的变量就是临时变量,但是其实这是一个很大的误区,我们自己临时创建的变量其实并不是临时变量,而是一个短期的局部变量,虽然我们自己感觉只是临时使用。
那什么才是真正的临时变量呢,临时变量又是什么时候使用的呢?下面来简单介绍一下我对临时变量的一些理解,下面的介绍有很多是经过网上查询了解所得,如有误,请勿见怪。
临时变量就上我们上面说的并不是我们临时创建的变量,而是,由编译器在程序需要的时候自动生成的临时性变量,它们并不在代码中出现,但是它们又是确实存在的,而临时变量的生成时机通常是在函数参数传递时发生类型转换,以及函数返回值时被创建。例如下面这个例子:
void Fun(short &s)
{
cout << "Fun" << endl;
}
void FunCon(const short &s)
{
cout << "FunCon" << endl;
}
int main()
{
int iTest = 20;
Fun(iTest);//error
FunCon(iTest);//ok,iTest是一个int变量,但是函数参数为short型的常量引用,这时系统就会产生一个short型的临时变量
return 0;
}
上面的例子中我们定义了两个函数,两个函数猛一看好像差不多,但是仔细看会发现两个函数唯一的不同就在于两个函数的形参一个是非const引用,而一个是const引用,这一点微小的差别却导致了上面程序一个函数能够运行成功,而一个是不行的,这是为什么呢,仅仅差了const而已罢了,但是就是这一个const确实天差地别。
这里就牵扯到两点了,第一点、编译器对待临时变量的态度,即临时变量作为引用参数传递时编译器是怎么处理的呢,第二点、const引用与非const引用在此的使用。
zjfaok
2013-03-30 · TA获得超过6806个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1619万
展开全部
所谓“未定义行为”就是说什么情况都有可能出现,程序员无法确定会发生什么……
如果硬要追究原因的话,*p=a(b)之后又执行了几次<<运算,函数a的参数所占的内存区域早已被其他变量覆盖,而a(b)之后立即访问返回的地址处的变量,函数a的参数所占的内存区域还没有被覆盖,所以能够得到正确的值……这种东西,测试一下,知道有这回事就好,真正写代码的时候不要用,因为永远不能断定会不会出现你预想的结果……
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
矫闳权映菱
2019-11-10 · TA获得超过3842个赞
知道大有可为答主
回答量:3124
采纳率:26%
帮助的人:221万
展开全部
所谓“未定义行为”就是说什么情况都有可能出现,程序员无法确定会发生什么……
如果硬要追究原因的话,*p=a(b)之后又执行了几次<<运算,函数a的参数所占的内存区域早已被其他变量覆盖,而a(b)之后立即访问返回的地址处的变量,函数a的参数所占的内存区域还没有被覆盖,所以能够得到正确的值……这种东西,测试一下,知道有这回事就好,真正写代码的时候不要用,因为永远不能断定会不会出现你预想的结果……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
昨儿忘了前天
2013-03-30
知道答主
回答量:12
采纳率:0%
帮助的人:3.7万
展开全部
调用函数a(b)完成后,系统会释放参数b在栈区的空间,栈区的应用率很高,所以原来b的那块内存会被覆盖,而P向的是被修改以后的内存,而直接调用*(a(b))的话,会在b没有被覆盖前把b的值取出来。如果这样定义函数就不会出现这样的情况了。int * a(int & x){return &x}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cossbow
2013-03-30 · TA获得超过697个赞
知道小有建树答主
回答量:798
采纳率:100%
帮助的人:224万
展开全部
return &x;
返回的是 x 的地址,返回后 x 注销,但地址作为值传递给 *p
就这么回事
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式