【问题标题】:Displaying addresses using range-based loops in C++在 C++ 中使用基于范围的循环显示地址
【发布时间】:2025-11-26 10:05:01
【问题描述】:

为什么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");
}

【问题讨论】:

  • 因为在这种情况下auto 被推导出为int?你以为是什么?
  • 显式循环等效项是... { auto m = ar[i]; cout &lt;&lt; &amp;m &lt;&lt; ...

标签: c++ loops auto


【解决方案1】:

使用auto m,您可以在基于范围的循环中按值/复制传递(数组)元素:

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

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

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

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

现在m 一个实际的数组元素,&amp;m 代表预期的数组元素地址。

【讨论】:

    最近更新 更多