|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下边代码将打印什么值?
#include <stdio.h>
int main()
{
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p)[10] = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
上机测试是会打印出array[4]的值也就是4;自己也是将*(*(p+1)-6)理解为array[10-6] = array[4];但以下是小甲鱼的分析,我粘贴过来的:
答:4
解析:基本上一道题成功理解的话,这道题就不会有什么问题。指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array[11],所以 *(*(p+1)-6) == array[11 - 6] = array[5]。
PS:如果我把打印的代码写成这样 printf("%d\n", (*(p + 1))[-6]); 现在你应该也可以理解了吧!
小甲鱼这结果是对的,但是不是应该将*(p+1)分析为array[10];而不是array[11]?????????????
定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 array[9] 这个元素值;
而 array[11] 实际上并不存在,小甲鱼老师为了说明问题(“p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置”))才用之,所以,按照数组的定义,array[5] 是第5个元素,指向的是 array[4] 这个元素值。
你将 *(*(p + 1) - 6) 理解为 array[10 - 6] = array[4] 错误有二:
1、*(p + 1) 已经不是程序所定义的范围
2、用一个程序定义的范围 (array[10])来运算程序非定义的值本身就是错误的,array[10 - 6] = array[4]
|
|