Разыменование указателя на массив

88
07 ноября 2021, 10:00
int array[3]{1,2,3};
int (*ptr)[3]=&array;

при разыменовании

std::cout<<*ptr;
(или std::cout<<ptr[0])
показывает адрес.

Тут указатель разыменовывается в массив, который распадается на указатель_на_первый элемент? Типа указатель_на_указателя?

Но это вряд ли, тогда бы ptr[0]+1 показал адрес следующего элемента.

Или в std::cout<<ptr[0]; массив распадается, а в std::cout<<ptr[0]+1; не распадается?

Answer 1

В отладчике GDB есть такая комнада как ptype, которая показывает тип какого-либо выражения. Она поможет нам разобраться:

(gdb) list
1   #include <iostream>
2   
3   int main()
4   {
5       int array[3] = {1, 2, 3};
6       int (*ptr)[3] = &array;
7   
8       std::cout << *ptr;
9   }
(gdb) ptype array
type = int [3]
(gdb) ptype ptr
type = int (*)[3]
(gdb) ptype *ptr
type = int [3]

Получается, что в строке

std::cout << *ptr;

*ptr — это сам array, который из типа int [3] неявно преобразуется1 в тип int *, т. е. в адрес первого элемента массива.

1. Имеет место array-to-pointer decay.

READ ALSO
Как писать Native программы?

Как писать Native программы?

Подскажите где можно почитать про написание Native программ (которые можно запустить до запуска графической оболочки Windows)Пока только нагуглил,...

84
Как правильно задать пространство имен

Как правильно задать пространство имен

Как на примере этого класса исправить ошибку компиляции?

211
способ добавить cleanup-code в легаси код

способ добавить cleanup-code в легаси код

Есть условная легаси функция (2к строк) с кучей точек завершения

117