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; не распадается?
В отладчике 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.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости