在C++中使用基于范围的循环显示地址

-2 c++ loops auto

为什么基于范围的循环没有auto显示地址?该for循环:

for (int i = 0; i < s; i++) cout << &ar[i] << endl; 
Run Code Online (Sandbox Code Playgroud)

工作正常,但基于范围的循环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");
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*Ron 6

因为auto m您在基于范围的循环中按值/复制传递(数组)元素:

for (auto m : ar) { // pass by value
    std::cout << &m << ' '; // prints addresses of copies, not the actual array elements
}
Run Code Online (Sandbox Code Playgroud)

这意味着m在每次迭代中成为数组元素的副本,并在内存中具有自己的地址.

如果您通过reference(auto& m)传递或引用const(const auto& m),您将观察到预期的结果:

for (auto& m : ar) { // pass by reference
    std::cout << &m << ' '; // prints addresses of the actual array elements
}
Run Code Online (Sandbox Code Playgroud)

现在m 一个实际的数组元素,&m并按预期表示数组元素地址.