为什么这段代码打印地址?

Kun*_*l B 2 c multidimensional-array

为什么在意外打印2D阵列的一个维度时没有出现编译时错误?

#include <stdio.h>

void main() {
    int i;
    int arr[2][3] = { 1, 2, 3, 4, 5, 6 }; //<- Declared a 2D array

    for (i = 0; i < 6; i++) {
        printf("%d\n", arr[i]);  // <- Accidently forgot a dimension
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该收到编译时错误,但我得到了一组地址!为什么?arr[0]在这种情况下编译器的意思是什么?

小智 8

数组类型的表达式求值为大多数上下文中指向第一个数组元素指针(一个值得注意的例外,其中包括sizeof运算符).

在您的示例中,arr[i] 具有数组类型.所以它计算为一个类型int (*)[]的指针(一个指向数组的指针).这就是印刷品.打印指针%d未定义的行为,因为printf()将读取指针就好像它是一个int.