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

Declaring variable as i vs &i in the foreach loop

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

#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 0x61fdbc 0x61fdb

& 运算符有很多用途。这两个很难识别,即声明中变量的 & 前面(例如 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)

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

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

另一边:

cout<<&i<<" ";

导致打印 i 的地址。