Я программировал c/С++ в течение многих лет, но сегодняшнее случайное открытие заставило меня несколько любопытно... Почему оба вывода дают одинаковый результат в коде ниже? (arr - это, конечно, адрес arr[0], то есть указатель на arr[0]. Я бы ожидал, что &arr будет адресом этого указателя, но имеет то же значение, что и arr)
int arr[3];
cout << arr << endl;
cout << &arr << endl;
Примечание. Этот вопрос был закрыт, но теперь он снова открывается. (Спасибо?)
Я знаю, что &arr[0] и arr оценивается на один и тот же номер, но это не мой вопрос! Возникает вопрос, почему &arr и arr оцениваются на один и тот же номер. Если arr является литералом (не сохраняется), компилятор должен жаловаться и сказать, что arr не является значением lvalue. Если адрес arr хранится где-то, тогда &arr должен указать мне адрес этого места. (но это не так)
если я пишу
const int * arr2 = arr;
то arr2[i]==arr[i] для любого целого i, но &arr2 != arr.