int array[2][3] = {{2,3,6},{4,5,8}};
printf("%d\n",*array);
这将是什么输出,请解释如何?
问候,
温斯顿
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]);
自学多维数组。
Arrayarray
是一个二维数组:
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
将转换为 type int *
。格式说明符%d
需要 type 的参数,int
但您传递的是 type 的参数int *
。编译器必须为此抛出警告消息。此外,错误的格式说明符会导致未定义的行为。
如果要打印指针,请使用%p
格式说明符。请记住,格式说明符%p
期望参数应该是指向 的指针void
,因此您应该键入将指针参数转换为void *
。