Отображение адресов с использованием циклов на основе диапазона в C ++ - PullRequest
0 голосов
/ 27 июня 2018

Почему цикл на основе диапазона с 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");
}

1 Ответ

0 голосов
/ 27 июня 2018

Поскольку с 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 представляет ожидаемый адрес элемента массива.

...