int array[2][3] = {{2,3,6},{4,5,8}};
printf("%dn",*array);
这将产生什么结果,请解释如何?
问候
温斯顿
学习多维数组。
数组array
是一个 2D 数组:
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("%dn",*array);
*array
将转换为类型int *
。格式说明符%d
需要类型int
的参数,但您传递的是int *
类型的参数。编译器必须为此抛出警告消息。此外,错误的格式说明符会导致未定义的行为。
如果要打印指针,请使用%p
格式说明符。请记住,格式说明符%p
期望参数应该是指向void
的指针,因此您应该键入强制指针参数到void *
。
这个 printf 的调用
printf("%dn",*array);
调用未定义的行为,因为指针表达式使用了不正确的转换说明符%d
。
如果你会写
printf("%pn", ( void * )*array);
然后将输出数组占用的内存范围的地址,即数组第一个元素的地址。
这就是表达式*array
的类型为int'[3]
。在调用中用作参数printf
它被隐式转换为指向类型int *
的第一个元素的指针。和写
printf("%pn", ( void * )&array[0][0]);