#include <iostream>
using namespace std;
int main() {
char a[][6] = { "hello", "hii" };
cout << a << ", " << *a << ", " << **a;
return 0;
}
输出:0x7ffd1f44a20c, hello, h
现在,我们知道数组名(在这里是'a')在2D数组中指向1D数组(在这里是' hello", *a将指向中的元素(a指向的1D数组)数组和**a将使用*a所指向的值。现在在这种情况下,我有点困惑,因为两个原因:
- 输出是正确的,因为'a'指向的值是"hello",并且*a将打印'a'指向的值。
- 输出是错误的,因为*a本身指向的是1D数组中的元素,因此*a应该打印出与a指向的1D数组的第一个元素对应的地址,输出应该是:
期望输出:0x7ffd1f44a20c,h地址h
非常感谢您的耐心等待!
a
只是一个" 2D数组";在有限的意义上。这是c++从C继承的有点奇怪且不超级一致的数组语义的一部分,就像数组到指针的衰减。
因此,当您定义a
时,存储在内存中的内容依次为:h, e, l, l, o, , h, i, i, , -
- 当您键入
a[x][y]
时,这是该序列中的x*6 + y字符(键入char
); - 当您输入
a[x]
时,它将衰变成指向序列中第x*6个字符的char*
。 - 当你输入
a
时,它衰变成一个指向6元素数组的指针,指向从序列的第0个位置开始的6元素数组。
在GodBolt上也可以看到这一点(使用type_name功能)。