Не понимаю, почему выводится элемент массива, а не адрес его памяти
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 шт):
ведь запись выше, эквивалентна (= &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
.
При выводе через сиаут, я получаю адрес, почему при указателе результат другой?
Не понял.