您的位置:首页 > 其它

函数结束后,里面的局部变量还可以用吗

2012-04-02 16:59 239 查看
int *fun1()

{

int a = 1;

return &a;

}

int main()

{

int *p =fun1();

cout<<"*p="<<*p<<endl;

*p = 100;

cout<<"*p="<<*p<<endl;

return 0;

}

结果:

*p=1

*p=100

以上可以看出a在fun1中是个局部变量,按理说该函数结束后,a变量应该不能访问了,

但是上面的例子中,通过返回a的地址,在fun1()调用后,打印了a(也就是*p)的值发现

还是fun1()中a的初始值1,然后又对a进行赋值,发现也可以,没出错。从这里看出其

实一个函数中的局部变量在该函数结束后,很多情况下还是可以对它访问的,只要有它

的地址。上面的例子中,fun1()调用后打印a的值是1,这貌似是理所当然的,因为

fun1()中初始化a=1,而且后面也没明显有改变a值的操作。当然还是a为1咯!但是真是

这样吗?看下面代码:

int *fun1()

{

int a = 1;

cout<<a<<endl;

return &a;

}

int main()

{

int *p =fun1();

cout<<"*p="<<*p<<endl;

return 0;

}

上面代码执行后结果:

a=1

*p=4199929

(上面结果中*p就是a,p指向的就是变量a的地址,所以*p就是a)

发现调用fun1()后的a值竟然变了(1变成4199929),也没明显改变a值的操作啊,这是为什么呢?这个例子和第一个的区别只在于fun1()中只多了"cout<<a<<endl;"这句而已;难道是因为这句?对的,

就是因为这句代码,该句代码其实是这样的:cout.operator<<(a).operator<<(endl);

也就是说a作为实参传个了cout.operator<<();那是不是其他函数用a为实参时a也会变

化呢?

void power(int a)

{

int b;

b = a;

}

int *fun1()

{

int a = 1;

power(a);

return &a;

}

int main()

{

int *p =fun1();

cout<<"*p="<<*p<<endl;

return 0;

}

结果为:

*p=4199915

发现结果也变了。我们猜想是不是因为对a所在的内存进行了操作导致的呢?

int *fun1()

{

int a = 1;

int b = a;

return &a;

}

int main()

{

int *p =fun1();

cout<<"*p="<<*p<<endl;

return 0;

}

结果:

*p=1

把a的值赋给新建的变量b(对a的地址操作了),发现这样子的话,结果为1,没有改变。

void power(int a)

{

}

int *fun1()

{

int a = 1;

power(a);

return &a;

}

int main()

{

int *p =fun1();

cout<<"*p="<<*p<<endl;

return 0;

}

结果:

*p=4199915

其中power函数体内没对a有任何操作,a的值也发生了变化。可以证明是函数调用的准

备工作或者收尾工作导致了a的值变化,具体是什么原因小菜我目前也还不知道。^_^

指针是很强大的,但不要滥用指针。

---------本人菜鸟一只,文章如有错误,大牛们多多指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐