s1e23课后题,
&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),然后 (int *) 将其强制转换为一个整型地址(指针),所以指针变量 p 初始化后,指向的地址应该是 array(第 11 个元素),所以 *(p - 6) == array == array == 4。这个是小甲鱼的课后题,有好多不清楚的地方,为什么&array + 1 指向的就是整个数组最后的位置(第二个 array 数组的起始位置),为什么会有第二个数组,不是就一个数组吗,这个+1指的是加了array整个数组的地址长度吗,不是很明白,希望大佬能帮忙解释一下{:10_303:} 本帖最后由 村里小黑 于 2021-9-28 10:08 编辑
是这样的,例如有如下数组
a={b0,b1,...,b9};(1)
那么a+1指的就是b1的地址:
我们转换一下,把b0换位一个数组即 :b0={b00,b01};同理转换其他的;
转化后如下:
a={,...,};(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) 村里小黑 发表于 2021-9-27 16:11
是这样的,例如有如下数组
a={b0,b1,...,b9};(1)
那么&a+1指的就是b1的地址:
感谢你的回答,我还有一个问题,那为什么p初始化后之的地址是array啊,也就是b9,并不是b1?{:10_266:},我真是懵这里, 金耳钩 发表于 2021-9-28 08:52
感谢你的回答,我还有一个问题,那为什么p初始化后之的地址是array啊,也就是b9,并不是b1?{:10_266 ...
#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;
}
你说的应该是这个代码吧(特意花10鱼币买的)
这个是这么理解,首先区分一下a和&a的区别,a代表一个数组的名称,也代表数组第一个元素的地址。&a是把整个数组看为一个数(如同b0)的地址,有点绕,我们这样看,把因为a为数组第一个元素的地址,指针指向的话为
int *p;
p0 = a0;(注意这里没有&)
a0 = &p0;
而你看代码中
p=(&array + 1)
这就相当于 p1 = (&(&p0)+1);
那么自然指向的就是数组a0的下一个数组比如说a1的地址了(前提是两个数组地址相连),也就是a0数组最后一个地址在偏移一个位的地址
为什么和我之前说的不一样呢,因为之前说的是一个二维的数组,同时写的有些不规范在改正,上面主要是为了明白+1的作用 就这么说吧,
首先,假设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)。
番杰 发表于 2021-9-29 15:10
就这么说吧,
首先,假设array数组的起始地址是0,长度是10,即array数组占用的地址为:0-9。
我明白了,谢谢你{:10_257:}, 村里小黑 发表于 2021-9-28 10:01
你说的应该是这个代码吧(特意花10鱼币买的)
这个是这么理解,首先区分一下a和&a的区别,a代表一个数 ...
我明白了,谢谢你{:10_257:} 金耳钩 发表于 2021-9-29 16:29
我明白了,谢谢你
明白就好,对我来说也是个学习的过程{:10_297:} 村里小黑 发表于 2021-9-29 16:35
明白就好,对我来说也是个学习的过程
{:10_275:}
页:
[1]