c++中的多维数组和指针


int a[2][2] = {{1, 2}, {3, 4}};
cout << a << endl;
cout << *a << endl;
cout << &a[0][0] << endl;

该代码的输出是:

0x7fff3da96f40
0x7fff3da96f40
0x7fff3da96f40

但是,如果a0x7fff3da96f40,那么*a应该是地址0x7fff3da96f40(1)中的值。

但是,我们再次得到相同的地址。

为什么会发生这种情况?

*a应为地址0x7fff3da96f40中的值

。关键是值的类型,该类型是int[2]

cout不能直接打印数组,但它可以打印指针,所以你的数组被隐式地转换为指向它的第一个元素的指针,并这样打印。

数组的大多数用途都进行这种转换,包括对数组应用*[]

如果你尝试

int a[2][2] = {{1, 2}, {3, 4}};
cout << a << endl;
cout << *a << endl;
cout << &a[0][0] << endl;
cout << typeid(a).name() << endl;
cout << typeid(*a).name() << endl;
cout << typeid(&a[0][0]).name() << endl;

可能的输出是

0x7ffe4169bb50
0x7ffe4169bb50
0x7ffe4169bb50
A2_A2_i
A2_i
Pi

现在你可以看到你使用的变量是什么类型了。它们是不同的实体,从相同的内存地址开始。

最新更新