码迷,mamicode.com
首页 > 编程语言 > 详细

c++的for循环中变量地址问题

时间:2017-08-12 18:10:09      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:固定   cpp   变量   使用   为什么   定义   一个队列   二次   作用   

for f(int i; i<10; i++)
{
    int c=0;
    cout<<c<<&c<<endl;
}

看这个简单的代码,新玩家容易有这样的认识:既然for循环中的代码被循环执行,那么为什么变量c没有被重定义呢。

这个问题看过任何一本c++教材头两章的都能解答,是因为作用域的存在。变量c在每一次循环结束后存储空间会被释放掉,而在下一次循环开始的时候再次定义。

那么,第二次循环中的变量的地址和第一次循环变量的地址是在同一个存储位置吗?

答案是肯定的。并且如果中间又声明了其他的变量,比如在第三次循环是声明了另一个变量,最后的执行结果依旧是这十次循环c的地址都没有改变。

这可能是和编译器有关,通过编译器的优化使得作用域内的变量的位置固定了。因此如果涉及到对循环内变量的地址的保存工作,如将变量的地址存在一个队列或者容器中,最好使用new或者malloc,否则容器存的多个变量地址很可能都是指向同一个位置,从而导致程序出现奇怪的结果。如下面这段代码:

vector<int*> res,res2;
for f(int i; i<10; i++){
    int c=i;
    int* d=new int(i);
    res.push_back(&c);
    res2.push_back(d);
}

  最终的结果res中c的地址都是一样的,c中保存的数也都是最后一次循环中c的结果。而res2中d的地址则不相同,保存的i值是从0到9.

c++的for循环中变量地址问题

标签:固定   cpp   变量   使用   为什么   定义   一个队列   二次   作用   

原文地址:http://www.cnblogs.com/zhengguanru/p/7350912.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!