在 foreach 循环中将变量声明为 i vs &i



为什么这些循环给出相同的输出:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ar = {2, 3 ,4};
for(auto i: ar) //this line changes in the next loop
cout<<i<<" ";
cout<<"n";
for(auto &i: ar) //i changed to &i
cout<<i<<" ";
}

它们都提供相同的输出:

2 3 4

2 3 4

在声明foreach循环变量时,不应该添加"与"并使变量接受数组中值的引用,而打印i则使其打印引用。这里发生了什么?

我所说的打印参考资料是指类似于以下代码打印的东西:

for(auto i: ar)
cout<<&i<<" ";

输出:

0x61fdbc 0x61fdbc0x61fdb

结果是相同的,因为在第一个循环中,您将变量的值复制到新变量i中并打印其值。(额外分配RAM(

在第二个循环中,通过将当前元素的地址分配给i,可以从内存中访问该元素的值。(未分配额外RAM(

另一边:

cout<<&i<<" ";

导致打印CCD_ 3的地址。

与号运算符有很多用途。这两个是很难识别的,即声明中变量前面的&(如int& i(或int &i,相同((和声明中未变量前面的&,如cout << &i

试试这些,你会更好地理解。

for (auto i : ar)
cout << i << " "; // 2 3 4 // element of ar

for (auto &i : ar)
cout << i << " "; // 2 3 4 // element of ar
for (auto i : ar)
cout << &i << " "; // address of local variable i (probably same address)

for (auto &i: ar)
cout << &i << " "; // address of elements of ar (increasing addresses)

最新更新