如何理解/可视化指向数组第一个索引的概念数组变量名?

Dar*_*n L 1 c arrays

void main()
{
        int array[10] = {1,2,3,4,5,6,7};
        printf("%p\n",array);
}
Run Code Online (Sandbox Code Playgroud)

这里,系统将在堆栈中分配相当于10个整数的内存.但是,我不认为为变量数组分配任何额外的内存,我认为这array是人类理解和编码目的的助记符.如果是这种情况,那么printf()语句中的内容如何- printf("%p\n",array);接受它就好像它是一个指针变量?

随着阵列的尺寸不断增加,这种混淆变得更加明显.

int main()
{
        int matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
        printf("%p\n", matrix);
        printf("%p\n", matrix+1);
        printf("%p\n", *(matrix+1));
}
Run Code Online (Sandbox Code Playgroud)

其中一个程序执行的输出是 -

0x7ffd9ba44d10
0x7ffd9ba44d20
0x7ffd9ba44d20
Run Code Online (Sandbox Code Playgroud)

这样既matrix+1和*(matrix+1),间接输出后相同的虚拟内存地址.我理解为什么matrix+1地址是它显示的内容,但我不明白为什么*(matrix+1)即使在间接后也输出相同的地址!

use*_*738 5

井数组不是指针.大多数情况(例外sizeof,&运算符_alignof等) - 它被转换为(数组衰减)指向第一个元素的指针.

所以这里matrix被转换(衰减)成指向第一个元素的指针 - int (*)[4]当传递给它时printf.

现在逐个剖析,matrix+1将指向2d数组的第二个元素,它是2d数组的第二个元素(这就是为什么它们sizeof(int)*4相隔一段时间.

在第三种情况下它们是相同的,因为matrix+1它是类型的int (*)[4],当你取消引用它时,你得到的int[4]基本上与之前的地址相同.


有一点要记住 - 指针有两件事

  • 这是有价值的
  • 它的类型.

两个指针可能具有相同的值,但它们的类型可能不同.你也看到了这一点.

它(腐朽)在标准6.3.2.1p3中提到: -

除非它是运算sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型'array of type'的表达式转换为具有'pointer to type'指向数组的初始元素的类型的表达式对象并不是左值.

您也以错误的方式打印地址(这是您使用铸造的情况之一).

printf("%p",(void*)matrix);
Run Code Online (Sandbox Code Playgroud)

为了使事情更清楚: -

matrix基本上是一个int[2][4]在你所展示的情况下腐烂的物体int(*)[4].你可能想知道是什么让它matrix+1 指向数组的第二个元素 - 事物是指针算术由它所指向的东西来指示.这里matrix作为衰减到第一个元素(int(*)[4])的指针,它将移动4 ints 的大小.