为什么带有auto
的基于范围的循环不显示地址?
for
循环:
for (int i = 0; i < s; i++) cout << &ar[i] << endl;
正常工作,但是与auto
的基于范围的循环不起作用:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int ar[] = { 12,-23,0,1,2 };
int s = sizeof(ar) / sizeof(int);
int * m = &ar[0];
sort(&ar[0], m+ s);
for (auto m : ar)
cout << m << endl;
cout << endl;
for (auto m : ar)
cout << &m << endl;
cout << endl;
for (int i = 0; i < s; i++)
cout << &ar[i] << endl;
system("pause");
}
答案 0 :(得分:6)
由于使用auto m
,您正在按值传递(数组)元素/在基于范围的循环中复制:
for (auto m : ar) { // pass by value
std::cout << &m << ' '; // prints addresses of copies, not the actual array elements
}
这意味着m
在每次迭代中都会成为数组元素的副本,并且在内存中有其自己的地址。
如果通过引用(auto& m
)或引用const(const auto& m
)传递,则会观察到预期的结果:
for (auto& m : ar) { // pass by reference
std::cout << &m << ' '; // prints addresses of the actual array elements
}
现在m
是一个实际的数组元素,而&m
代表了预期的数组元素地址。