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