在使用c++容器的时候,范围for语句是最基本的操作,但是在使用范围for语句的时候,有一个小问题不知道大家有没有注意到:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string> svec{"hello", "world", "hi"};
for(auto s:svec) //第一种情况,s前面不加引用&
{
cout << &s <<endl; //尝试输出容器中每个变量的地址
}
VS2015环境运行结果如下图1:
for(auto &s:svec) //第二种情况,引用s
{
cout << &s << endl;//同上,尝试输出容器中每个元素的地址
}
运行结果如下图2:
综上:在范围for语句中,循环变量不使用引用的时候,
每次读取容器中元素的副本存到该循环变量中,
因此输出的地址为该循环变量的地址,
自然是不变的。当循环变量使用引用的时候,
每次传递给循环变量的是容器中元素的地址,
所以,如果想要获得容器中各个元素的地址,
请把范围for语句的循环变量设置为引用,这样每次都能获取到不同元素的地址。
图1
图2