C中多维数组的指针

Pointers with multi dimensional arrays in C

int array[2][3] = {{2,3,6},{4,5,8}};

printf("%d\n",*array);

这将是什么输出,请解释如何?

此致,

温斯顿

本次调用printf

printf("%d\n",*array);

调用未定义的行为,因为在指针表达式中使用了不正确的转换说明符 %d

如果你改写

printf("%p\n", ( void * )*array);

则输出数组占用内存区的地址,即数组第一个元素的地址。

即表达式 *array 的类型为 int'[3]。在 printf 的调用中用作参数,它被隐式转换为指向类型 int * 的第一个元素的指针。和写

一样
printf("%p\n", ( void * )&array[0][0]);

自学多维数组。

数组array是一个二维数组:

int array[2][3] = {{2,3,6},{4,5,8}};

*array 是数组 array 的第一个元素,因为

*array -> * (array + 0) -> array[0]

数组array的第一个元素是array[0],也就是{2,3,6}array[0] 的类型是 int [3]。 当您访问数组时,它会转换为指向第一个元素的指针(此规则很少有 例外情况 )。

所以,在这个声明中

printf("%d\n",*array);

*array 将转换为类型 int *。格式说明符 %d 需要 int 类型的参数,但您传递的是 int * 类型的参数。编译器必须为此抛出警告消息。此外,错误的格式说明符会导致未定义的行为。

如果要打印指针,请使用 %p 格式说明符。请记住,格式说明符 %p 期望参数应为指向 void 的指针,因此您应该将指针参数类型转换为 void *.