标签:固定 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.
标签:固定 cpp 变量 使用 为什么 定义 一个队列 二次 作用
原文地址:http://www.cnblogs.com/zhengguanru/p/7350912.html