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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите где можно почитать про написание Native программ (которые можно запустить до запуска графической оболочки Windows)Пока только нагуглил,...
Есть условная легаси функция (2к строк) с кучей точек завершения