Не понимаю, почему выводится элемент массива, а не адрес его памяти

int array[5]{1,24,5,61,4}
int *p = array + 2 

Почему я получаю элемент массива, а не его адрес в памяти? ведь запись выше, эквивалентна (= &array + 2), заранее извиняюсь за глупый вопрос, я новичок в плюсах, и очень хочу разобраться с указателями. В коде выходит, что можно свободно обращаться к p[0] как к массиву, и соответственно манипулировать. Но мне не понятно, почему в данном обращении я получаю элемент массива, а не его адрес в памяти, если я не разыменовываю его.

При выводе через сиаут, я получаю адрес, почему при указателе результат другой? Ведь я получаю int* (адресный тип), но далее p[0], никак его не разыменовываю. Извините, если нагородил глупостей, вполне могу много не понимать и соответственно неправильно мыслить..

std::cout << array + 2 << std::endl;

введите сюда описание изображения


Ответы (1 шт):

Автор решения: HolyBlackCat

ведь запись выше, эквивалентна (= &array + 2)

Не эквивалентна. Хотя array (который автоматически преобразуется в адрес первого элемента массива) и &array (адрес всего массива) - это одно и то же число, у них разные типы (array автоматически превращается в int *, а &array - это int (*)[5] - "указатель на массив из пяти intов"),

Поэтому + и [] ведут себя с ними по-разному.

+ i прибавляет к указателю i * sizeof(T), где T - тип, на который указывает указатель (int в первом случае и int[5] во втором).

В коде выходит, что можно свободно обращаться к p[0] как к массиву

Неправда. К p можно обращаться как к массиву (p[0]), а к самому p[0], очевидно, нельзя (p[0][0] не работает).

почему в данном обращении я получаю элемент массива, а не его адрес в памяти

a[i] - то же самое, что *(a + i). [] разыменовывает указатель автоматически.

Из этого следует, что a[0] - то же самое, что просто *a.

При выводе через сиаут, я получаю адрес, почему при указателе результат другой?

Не понял.

→ Ссылка