#include <stdio.h>
int main()
{
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = (int *)(&array + 1);
printf("%d\n", *(p - 6));
return 0;
}
`[Y+h%EwgS!1,82NJ
解析:首先你要明白虽然 array 和 &array 的值相同,但含义是不一样的。array 表示数组第一个元素的位置,而 &array 表示的是整个数组的位置(这里将数组看做一个整体)。Iw*<PQhUZ^
!`Z{zC3QUdVnYs7>]2}5-Mltk;w
因此,&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),然后 (int *) 将其强制转换为一个整型地址(指针),所以指针变量 p 初始化后,指向的地址应该是 array[10](第 11 个元素),所以 *(p - 6) == array[10 - 6] == array[4] == 4。pM V@o
`Zcl]*F <?Cw7Xgt^&$[E{DQ
重点强调:array 是数组第一个元素的地址,所以 array + 1 指向数组第二个元素;&array 是整个数组的地址,所以 &array + 1 指向整个数组最后的位置。#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;
}
基本上一道题成功理解的话,这道题就不会有什么问题。指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array[11],所以 *(*(p+1)-6) == array[11 - 6] = array[5]。但是我觉得后面这个题 跟上面是一样的也应该是array[10 - 6] == array[4] == 4,虽然这里是array[5],但答案依旧是4,不是很明白两个的区别 一个人是
array[4] == 4 一个是array[5]==4
本帖最后由 1055741510 于 2021-4-24 17:25 编辑
*(*(p+1)-6) 等价于 *(p[1] - 6) int (*p)[10] = &array定义了数组指针 即十个指针变量 其中指针p[0]指向array的首地址 p[1]指向array数组的下一个地址 即array[11](可以这么认为), p[1]-6就是让指针从array[11]向前移动6个int大小 你自己数一数指向的是4 也就是array[4]
|