Может кто-нибудь объяснить мне, что здесь происходит?Рассмотрим код
#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
что также не имеет смысла для меня.