在 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
的地址。
为什么这些循环给出相同的输出:
#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
的地址。