C ++: указатели в 2D-массивах сбивают с толку - PullRequest
0 голосов
/ 23 ноября 2018

Может кто-нибудь объяснить мне, что здесь происходит?Рассмотрим код

#include <iostream>

int main()
{
    int A[2][2] = {{0}};

    std::cout << A << std::endl;  // First stdout line
    std::cout << *A << std::endl;  // Second stdout line
    std::cout << *(*A) << std::endl;  // Third stdout line
}

( Попробуйте код здесь! )

Мне кажется, что A должен быть массивом из 2 указателей на массивы, каждыйиз которых должно содержать 2 указателя на int с.Однако при запуске кода в стандартный вывод записывается следующее:

0x7a665507cf80
0x7a665507cf80
0

Для меня это выглядит как адрес памяти первого элемента в A (напечатан в первой строке стандартного вывода)совпадает с адресом памяти первого элемента в *A.Как это возможно, учитывая, что A и *A явно являются двумя разными массивами (поскольку разыменование A и *A дает разные результаты)?

Альтернативная интерпретация вывода состоит в том, что памятьадрес 0x7a665507cf80 содержит либо значение 0x7a665507cf80 (т. е. указатель, расположенный в этой позиции - в данном случае A - указывает на себя), либо 0, в зависимости от того, к нему обращаются из A или *Aчто также не имеет смысла для меня.

1 Ответ

0 голосов
/ 23 ноября 2018

int A[2][2] = {{0}}; Это статический двумерный массив, это не указатель на указатель, это просто одномерный массив со специальным доступом.

Тот факт, что это не точка-указатель, а двумерный массив на1D массив означает, что A[0] или *A обращается к массиву и возвращает 1D массив, который является первой строкой.Затем вторая разыменование получает фактическое значение.Это обобщает до nD, если у вас есть int A[x][y][z][t]....

Таким образом, первые два являются «одним и тем же» адресом, но они не одного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...