鱼C论坛

 找回密码
 立即注册
查看: 1093|回复: 8

[已解决]s1e23课后题,

[复制链接]
发表于 2021-9-27 12:01:10 | 显示全部楼层 |阅读模式

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

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

x
&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),然后 (int *) 将其强制转换为一个整型地址(指针),所以指针变量 p 初始化后,指向的地址应该是 array[10](第 11 个元素),所以 *(p - 6) == array[10 - 6] == array[4] == 4。

这个是小甲鱼的课后题,有好多不清楚的地方,为什么&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),为什么会有第二个数组,不是就一个数组吗,这个+1指的是加了array整个数组的地址长度吗,不是很明白,希望大佬能帮忙解释一下
最佳答案
2021-9-28 10:01:56
金耳钩 发表于 2021-9-28 08:52
感谢你的回答,我还有一个问题,那为什么p初始化后之的地址是array[10]啊,也就是b9,并不是b1?{:10_266 ...
#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;
}
你说的应该是这个代码吧(特意花10鱼币买的)
这个是这么理解,首先区分一下a和&a的区别,a代表一个数组的名称,也代表数组第一个元素的地址。&a是把整个数组看为一个数(如同b0)的地址,有点绕,我们这样看,把因为a为数组第一个元素的地址,指针指向的话为
int *p;
p0 = a0;(注意这里没有&)
a0 = &p0;
而你看代码中
p=(&array + 1)
这就相当于 p1 = (&(&p0)+1);
那么自然指向的就是数组a0的下一个数组比如说a1的地址了(前提是两个数组地址相连),也就是a0数组最后一个地址在偏移一个位的地址

为什么和我之前说的不一样呢,因为之前说的是一个二维的数组,同时写的有些不规范在改正,上面主要是为了明白+1的作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 16:11:50 | 显示全部楼层
本帖最后由 村里小黑 于 2021-9-28 10:08 编辑

是这样的,例如有如下数组
a[10]={b0,b1,...,b9};(1)
那么a+1指的就是b1的地址:
我们转换一下,把b0换位一个数组即 :b0[2]={b00,b01};同理转换其他的;
转化后如下:
a[10][2]={[b00,b01],[b10,b11]...,[b90,b91]};(2)
重点来了:
根据之前说的a+1为b1的地址,那么他现在就相当于指向了b10;也就是所说的第二个数组的头
为什么呢?
首先先根据(1)去找b1的位置为a+1,又因为b1在存储中占了两个位置那么b10的地址就是(a+1+0;b11的地址就是(a+1+1
你不理解的+1就是我标红的部分,他是用来指向数组a中不同的数组bn(n=0-9)的,而在标蓝的+0或+1是为了指向数组b中不同的bnx(n为0-9,x为0或1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-28 08:52:24 | 显示全部楼层
村里小黑 发表于 2021-9-27 16:11
是这样的,例如有如下数组
a[10]={b0,b1,...,b9};(1)
那么&a+1指的就是b1的地址:

感谢你的回答,我还有一个问题,那为什么p初始化后之的地址是array[10]啊,也就是b9,并不是b1?,我真是懵这里,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-28 10:01:56 | 显示全部楼层    本楼为最佳答案   
金耳钩 发表于 2021-9-28 08:52
感谢你的回答,我还有一个问题,那为什么p初始化后之的地址是array[10]啊,也就是b9,并不是b1?{:10_266 ...
#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;
}
你说的应该是这个代码吧(特意花10鱼币买的)
这个是这么理解,首先区分一下a和&a的区别,a代表一个数组的名称,也代表数组第一个元素的地址。&a是把整个数组看为一个数(如同b0)的地址,有点绕,我们这样看,把因为a为数组第一个元素的地址,指针指向的话为
int *p;
p0 = a0;(注意这里没有&)
a0 = &p0;
而你看代码中
p=(&array + 1)
这就相当于 p1 = (&(&p0)+1);
那么自然指向的就是数组a0的下一个数组比如说a1的地址了(前提是两个数组地址相连),也就是a0数组最后一个地址在偏移一个位的地址

为什么和我之前说的不一样呢,因为之前说的是一个二维的数组,同时写的有些不规范在改正,上面主要是为了明白+1的作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-29 15:10:43 | 显示全部楼层
就这么说吧,
首先,假设array数组的起始地址是0,长度是10,即array数组占用的地址为:0-9。

在来回答你的问题:
(1)数组确实只有一个array,因为只定义了一个。
但是内存单元是很长的,在array数组后面还有其他的内存,10.11.12.13...(这些表示后面的内存地址)等等。

(2)&array+1中的,“+1”指的是加上array数组的的长度,即10。
前面已经假设了array数组的起始地址为0,所以&array+1就为0+10 = 10,
所以此时指针指向的是10这个地址(已经不属于array数组的地址范围)。

(3)(int *)这个强制转换就是改变指针的移动的步长,
之前是10(整个array的长度),转换后为1(正常在程序中,int *的步长为4字节,我这里对应我的例子,写为1)。

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

使用道具 举报

 楼主| 发表于 2021-9-29 16:28:01 | 显示全部楼层
番杰 发表于 2021-9-29 15:10
就这么说吧,
首先,假设array数组的起始地址是0,长度是10,即array数组占用的地址为:0-9。

我明白了,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-29 16:29:03 | 显示全部楼层
村里小黑 发表于 2021-9-28 10:01
你说的应该是这个代码吧(特意花10鱼币买的)
这个是这么理解,首先区分一下a和&a的区别,a代表一个数 ...

我明白了,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-29 16:35:01 | 显示全部楼层
金耳钩 发表于 2021-9-29 16:29
我明白了,谢谢你

明白就好,对我来说也是个学习的过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-29 17:27:24 | 显示全部楼层
村里小黑 发表于 2021-9-29 16:35
明白就好,对我来说也是个学习的过程

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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