int a[2][2] = {{1, 2}, {3, 4}};
cout << a << endl;
cout << *a << endl;
cout << &a[0][0] << endl;
该代码的输出是:
0x7fff3da96f40
0x7fff3da96f40
0x7fff3da96f40
但是,如果a
是0x7fff3da96f40
,那么*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
现在你可以看到你使用的变量是什么类型了。它们是不同的实体,从相同的内存地址开始。