二维数组中array-name所指向的值


#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所指向的值。现在在这种情况下,我有点困惑,因为两个原因:

  1. 输出是正确的,因为'a'指向的值是"hello",并且*a将打印'a'指向的值。
  2. 输出是错误的,因为*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功能)。

最新更新