s1e23
#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 + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置
&array指向整个数组,然后加一怎么就是数组的最后位置了?然后什么叫第二个array数组的起始位置??怎么还有第二个的这种说法,不才一个吗 本帖最后由 乐乐学编程 于 2020-10-16 22:39 编辑
你的题目的出处是?
a 表示首个元素的地址,类型是 int 内存大小是 4 所以 +1 内存地址加 4
但是 &a 表示的是整个数组 a 的地址 4*10 个大小的数据类型 所以 +40
我也不明白,怎么会有第二个数组,请告之题目的出处,我也去学习学习 https://blog.csdn.net/qq_23996069/article/details/89309016
这里是这样解释的,你先看看,我得先理解理解 我编写了一个小程序(如下),从运行的结果来看,&array + 1 超出了数组的范围(如图),楼上发出的那个链接的文章中认为 “ &array + 1 不是首地址 + 1,系统会认为加了一个 array 数组,偏移了整个数组 array 的大小(也就是 10 个 int 的大小)。所以 int *p = (int*)(&a + 1),其实 p 实际是 &(array),也就是 array + 10。
程序的运行输出情况来看也证实了这一点:&array 是数组指针,其类型为 int(*);(指向含有 10 个 int 的数组), array 是长度为 10 的 int 数组指针,长度为 10 * sizeof(int) = 40 字节,而 &array +1 的地址正好是 *p +9 的 4 个字节之后的地址,所以,&array + 1 实际似乎是 array 数组第 11个元素的地址,但是 array 的第 11 个元素是不存在的。因此,&array + 1 是下一个对象的地址,从而可以将第 11 个地址假想为 array 数组还有第二个数组,当然其数组名可以是 array,也可以是其他的数组名。
#include <stdio.h>
int main()
{
int *p,array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
p = array;
printf("%p\n", (p + 0));
printf("%p\n", (p + 1));
printf("%p\n", (p + 2));
printf("%p\n", (p + 3));
printf("%p\n", (p + 4));
printf("%p\n", (p + 5));
printf("%p\n", (p + 6));
printf("%p\n", (p + 7));
printf("%p\n", (p + 8));
printf("%p\n", (p + 9));
printf("%p\n", &array + 1);
return 0;
}
0022FEE8 到 0022FEEC ,还真是4个字节耶 乐乐学编程 发表于 2020-10-16 22:33
你的题目的出处是?
a 表示首个元素的地址,类型是 int 内存大小是 4 所以 +1 内存地址加 4
课后作业s1e23{:10_292:}
页:
[1]