鱼C论坛

 找回密码
 立即注册
查看: 858|回复: 5

[已解决]s1e23

[复制链接]
发表于 2020-10-16 22:17:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置
&array指向整个数组,然后加一怎么就是数组的最后位置了?然后什么叫第二个array数组的起始位置??怎么还有第二个的这种说法,不才一个吗
最佳答案
2020-10-16 22:45:47
https://blog.csdn.net/qq_23996069/article/details/89309016

这里是这样解释的,你先看看,我得先理解理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-16 22:33:48 | 显示全部楼层
本帖最后由 乐乐学编程 于 2020-10-16 22:39 编辑

你的题目的出处是?

a 表示首个元素的地址,类型是 int 内存大小是 4 所以 +1 内存地址加 4

但是 &a 表示的是整个数组 a 的地址 4*10 个大小的数据类型 所以 +40

我也不明白,怎么会有第二个数组,请告之题目的出处,我也去学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 22:45:47 | 显示全部楼层    本楼为最佳答案   
https://blog.csdn.net/qq_23996069/article/details/89309016

这里是这样解释的,你先看看,我得先理解理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 00:18:29 | 显示全部楼层
       我编写了一个小程序(如下),从运行的结果来看,&array + 1 超出了数组的范围(如图),楼上发出的那个链接的文章中认为 “ &array + 1 不是首地址 + 1,系统会认为加了一个 array 数组,偏移了整个数组 array 的大小(也就是 10 个 int 的大小)。所以 int *p = (int*)(&a + 1),其实 p 实际是 &(array[10]),也就是 array + 10。

      程序的运行输出情况来看也证实了这一点:&array 是数组指针,其类型为 int(*)[10];(指向含有 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[10] = {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;
}

过界数组地址.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 00:48:04 | 显示全部楼层
0022FEE8 到 0022FEEC ,还真是4个字节耶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 13:08:45 | 显示全部楼层
乐乐学编程 发表于 2020-10-16 22:33
你的题目的出处是?

a 表示首个元素的地址,类型是 int 内存大小是 4 所以 +1 内存地址加 4

课后作业s1e23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表