Я программировал 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
.