雨如洁 发表于 2021-4-22 10:53:53

数组指针课后习题答案问题

#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int *p = (int *)(&array + 1);

      printf("%d\n", *(p - 6));

      return 0;
}
`
解析:首先你要明白虽然 array 和 &array 的值相同,但含义是不一样的。array 表示数组第一个元素的位置,而 &array 表示的是整个数组的位置(这里将数组看做一个整体)。Iw*<PQhUZ^
!`Z{zC3QUdVnYs7>]2}5-Mltk;w
因此,&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),然后 (int *) 将其强制转换为一个整型地址(指针),所以指针变量 p 初始化后,指向的地址应该是 array(第 11 个元素),所以 *(p - 6) == array == array == 4。pM V@o
`Zcl]*F <?Cw7Xgt^&$
重点强调:array 是数组第一个元素的地址,所以 array + 1 指向数组第二个元素;&array 是整个数组的地址,所以 &array + 1 指向整个数组最后的位置。
#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = &array;

      printf("%d\n", *(*(p+1)-6));

      return 0;
}
基本上一道题成功理解的话,这道题就不会有什么问题。指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array,所以 *(*(p+1)-6) == array = array。但是我觉得后面这个题跟上面是一样的也应该是array == array == 4,虽然这里是array,但答案依旧是4,不是很明白两个的区别一个人是
array == 4一个是array==4

1055741510 发表于 2021-4-22 10:53:54

本帖最后由 1055741510 于 2021-4-24 17:25 编辑

*(*(p+1)-6) 等价于 *(p - 6) int (*p) = &array定义了数组指针 即十个指针变量 其中指针p指向array的首地址 p指向array数组的下一个地址 即array(可以这么认为), p-6就是让指针从array向前移动6个int大小 你自己数一数指向的是4 也就是array
页: [1]
查看完整版本: 数组指针课后习题答案问题