鱼C论坛

 找回密码
 立即注册
查看: 927|回复: 7

[已解决]数组指针问题

[复制链接]
发表于 2020-3-6 01:35:59 | 显示全部楼层 |阅读模式

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

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

x
  1. int temp[3]={1,2,3};                    
  2. int(*p)[3]=&temp;                    
  3. int i;                              
  4. for(i=0;i<3;i++)                     
  5. {                                 
  6.   printf(“%d\n”,*(*p+i));                        
  7. }                  
复制代码

格式化输出中,为什么*(*p+i)中的p,要用两次取值运算符
正常的指针法应该是*(p+i)
这个用了两次取值运算符的代码和正常的有什么不同
请大神给详细解释一下
最佳答案
2020-3-6 02:55:30
首先你要知道(*p)[3]是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a[0]的地址,例如第一层的(*p+2)实际上是temp[3]的地址,再取一次值才是temp[3]的内容。
这个问题如果搞不懂,证明你数组的指针表示方法肯定不会,建议巩固一下数组的指针表达方法不然后面一复杂起来就晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 02:55:30 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
首先你要知道(*p)[3]是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a[0]的地址,例如第一层的(*p+2)实际上是temp[3]的地址,再取一次值才是temp[3]的内容。
这个问题如果搞不懂,证明你数组的指针表示方法肯定不会,建议巩固一下数组的指针表达方法不然后面一复杂起来就晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 08:29:50 | 显示全部楼层
我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 10:32:26 From FishC Mobile | 显示全部楼层
兄弟来学习 发表于 2020-3-6 08:29
我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了

你说的很对,数组名确实是地址,但是这里是指向数组的指针,我要指向的是整个数组,即&temp,如果你只用temp表示指向的是temp[0]的地址,虽然这两个数值一样但是你用sizeof去测一下就会发现大小不同,证明&temp是整个数组的地址,只是因为开头的地址和temp[0]重合罢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 14:45:36 | 显示全部楼层
叫我miniQ 发表于 2020-3-6 02:55
首先你要知道(*p)[3]是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a[0]的地址 ...

问一下大佬 ,关于(*p + 2)这里,小甲鱼在指针与数组一节中讲到,(*(p + 1)) 和(*p + 1)明确不同,在讲课示例中有说(*p + 1)是将它的地址加 1 ,指针加 1 是(*(p + 1)),是指向数组的下一个元素。
按照这样来说,(*p + 2)应该是将 p 的地址加 2 吧?为什么会是temp[3]的地址呢?这里为什么不是写作(*(p + 2))呢?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 16:43:27 | 显示全部楼层
!!!!!!我才发现我这里写错了,实在不好意思,误导到你了。
1.你的最后一句话(*p+2)是将p的地址加2所以确实是temp[2]的地址
1.至于你所说的(*p+2)和*(p+2)的问题:
           首先要知道指针跨度的原理:
           (*p+1):比如这一题,我存进去的时候是用&a,跨度是整个数组的地址,因为数组也可以看作一层的指针,那么我就要先用*取一次值,让其地址变成跨度为数组中一个元素的跨度,这样我+1的时候编译器才知道默认为跨数组的一个元素,(*p+1)才是temp[1]的地址,*(*p+1)才是temp[1]的值
           *(p+1):在这一题当中,我存进去的时候是用&a,跨度是整个数组的地址,那你直接*(p+1),括号的优先级是最高的,所以他会先默认跨一整个数组的地址长度再取地址。举个&#127792;temp{1,2,3},你直接*(p+1)实际上是指向了这个数组最后一个元素的后一个地址(跨度为整个数组),你可以自己尝试用编译器打印一下地址。
          不知道这样你能不能理解,如果我有说错的地方你也可以提出来
           
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 16:44:22 | 显示全部楼层
教徒 发表于 2020-3-18 14:45
问一下大佬 ,关于(*p + 2)这里,小甲鱼在指针与数组一节中讲到,(*(p + 1)) 和(*p + 1)明确不同 ...

在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:48:21 | 显示全部楼层
叫我miniQ 发表于 2020-3-18 16:44
在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不

看到了,很清楚,感谢大佬,可以看懂了,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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