鱼C论坛

 找回密码
 立即注册
查看: 5046|回复: 21

数组指针,指针

[复制链接]
发表于 2019-2-15 21:09:17 | 显示全部楼层 |阅读模式

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

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

x

*(p+1)

*(p+1)

*(*p2+i)

*(*p2+i)


同样是将数组首地址存入指针变量里面,为什么在取得时候*(*p2+i)要多加一个*,而*(P+1)的P不用加*,我知道*p2取得是P2这个地址对应的值是temp的首元素的地址,但是这样反过来想*(P+1)就想不通了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-15 21:15:08 | 显示全部楼层
*P2取得是P2这个地址对应的值是temp数组元素的首地址,(*p2+i)是temp数组元素的首地址加偏移量i,最后*(*p2+1)就是取这个首地址加偏移量的地址的值了,但是为什么*(p+1),这个P不用*可以直接+1取到下一个元素,是因为这个P是直接表示的是b数组元素的首地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-15 21:31:19 | 显示全部楼层
本帖最后由 行客 于 2019-2-15 21:35 编辑

int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个元素,即b[0];所以p代表的是b[0]的地址。那么*(p+1)代表的是int类型的下一个地址,即b[1]。

int (*p2)[5]=&temp;,这里的p2指向的是一个int [5]类型的数组,p2是一个数组指针。*p2才代表了第一个数组元素,即相当于上面的p。

不知道,说到这里你想明白了没有。如果不清楚请继续跟帖。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
wjp + 1 + 1 明白了

查看全部评分

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

使用道具 举报

发表于 2019-2-15 21:31:22 | 显示全部楼层
第二个程序的*p2等价于第一个程序的p
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 20:11:51 | 显示全部楼层
行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...

P2是指向int[5]类型的数组和p指向int类型的变量,不都是指向地址吗,不都是要在加*才可以取这个地址里面的值吗,我还是没搞懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 20:14:40 | 显示全部楼层
行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...

那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个指针指向数组首元素的地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-17 09:30:48 | 显示全部楼层
本帖最后由 行客 于 2019-2-17 10:02 编辑
FE0636556 发表于 2019-2-16 20:14
那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个 ...


以下为垒了半个小时的文字,希望你能认真看,并希望能帮助到你:

问题一:
P2是指向int[5]类型的数组和p指向int类型的变量,不都是指向地址吗,不都是要在加*才可以取这个地址里面的值吗,我还是没搞懂
回复:
指针都是有类型的,虽然指向的地址都是同一个,但由于指针的原本类型不一样,所以你解引用时*p结果也不一样。比如
int *p;这里的p将会指向一个4字节,而char *p;里的p会指向一个1字节。即便两个指针指向的是同一个地址,解引用时的*p结果也不一样。同样,*(p+1)在int *类型下向后移动4个字节,而在char *类型下向后移动1个字节;也就是+1情况下的向后移动的“步长”是不一样的。
请你首先一定要看明白了问题一的答复,再看下面的问题二。

问题二:
那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个指针指向数组首元素的地址?
回复:
游客,如果您要查看本帖隐藏内容请回复


如有疑问,请继续跟帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-19 15:17:29 | 显示全部楼层
回复,看完整的答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-21 09:57:26 | 显示全部楼层
行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...

你的意思是 p2 指向的是 temp 数组的第一个元素的 地址的地址 吗?所以*p2才是数组的第一个元素的的地址,而**p才是第一个元素的值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-21 15:37:06 | 显示全部楼层
2316829671 发表于 2019-2-21 09:57
你的意思是 p2 指向的是 temp 数组的第一个元素的 地址的地址 吗?所以*p2才是数组的第一个元素的的地址 ...

不是的。P2是指向int[5]类型的数组。你看下本帖我7楼的回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 20:21:19 | 显示全部楼层
行客 发表于 2019-2-21 15:37
不是的。P2是指向int[5]类型的数组。你看下本帖我7楼的回复。

那百度百科
https://baike.baidu.com/item/%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84/8669080?fr=aladdin
为什么这么解释
111.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-23 10:18:54 | 显示全部楼层
2316829671 发表于 2019-2-22 20:21
那百度百科为什么这么解释

和这个解释没有矛盾的地方啊。所谓数组指针的不可移动,并非是指针的真正不可移动,而是指的是再自增1向后就可能不是标准的同类型数组了,也印证了P2是指向int[5]类型的数组,也就是说,如果p2+1是向后移动20个字节,20个字节后到底是什么就不好确定了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-1 23:10:10 | 显示全部楼层
p2是个指针数组,也就是它存放的是地址,也就是说p2中的元素都是地址值,(*p2)[5]=&tem
实际上是将temp的元素首地址传给p2的第一个元素,*p2得到的是temp的首地址,(*p2+i)就是temp中第i+1个元素的地址,*(*p2+i)就是取内容了啊,就是元素值了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 20:55:30 | 显示全部楼层
行客 发表于 2019-2-17 09:30
以下为垒了半个小时的文字,希望你能认真看,并希望能帮助到你:

问题一:

谢谢行客的详细解答,我想我大概明白你的意思了,但是还有一个疑问:int (*p2)[5] = &temp,那么p2的类型是 int (*)[5],也就是p2=数组temp的地址,也就是temp[0]的地址,那么解引用 *p2 就是获得数组temp的地址对应的值,那么这个值不就是temp的首个元素吗?但是,实际上解引用 *p2仍然是数组temp的地址,也就是说,在数值上,p2=*p2。你能告诉我,为什么是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 21:02:44 | 显示全部楼层
mqcake 发表于 2019-2-19 15:17
回复,看完整的答案!

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

使用道具 举报

发表于 2019-9-14 21:53:16 | 显示全部楼层
本帖最后由 bin554385863 于 2019-9-15 12:51 编辑

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

使用道具 举报

发表于 2021-3-13 11:06:00 From FishC Mobile | 显示全部楼层
回复,看大佬解析!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-14 16:53:49 | 显示全部楼层
第一张图:把数组b的首地址放在指针p中存放,p+1指针移动到数组中第二个元素的地址,p+2指针移动到第三个元素的地址,然后用取元素符号*就可以把对应位置的元素取出来了
第二张图:括号的优先级最高,所以这是一个指针类型的数组,而且数组中的元素存放的是{1,2,3,4,5}这些值的地址,*p2+i表示第i位元素的地址,再用*将总共地址中存放的元素取出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 01:40:45 | 显示全部楼层
数组指针,指针 [修改]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 09:18:43 | 显示全部楼层
数组指针(*p)[5]中(*p)可以看成是二维数组首地址p[2][5]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 03:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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