巨兔12138 发表于 2020-3-6 01:35:59

数组指针问题

int temp={1,2,3};                  
int(*p)=&temp;                  
int i;                              
for(i=0;i<3;i++)                     
{                                 
printf(“%d\n”,*(*p+i));                        
}                  

格式化输出中,为什么*(*p+i)中的p,要用两次取值运算符
正常的指针法应该是*(p+i)
这个用了两次取值运算符的代码和正常的有什么不同
请大神给详细解释一下

叫我miniQ 发表于 2020-3-6 02:55:30

首先你要知道(*p)是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a的地址,例如第一层的(*p+2)实际上是temp的地址,再取一次值才是temp的内容。
这个问题如果搞不懂,证明你数组的指针表示方法肯定不会,建议巩固一下数组的指针表达方法不然后面一复杂起来就晕了

兄弟来学习 发表于 2020-3-6 08:29:50

我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了

叫我miniQ 发表于 2020-3-6 10:32:26

兄弟来学习 发表于 2020-3-6 08:29
我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了

你说的很对,数组名确实是地址,但是这里是指向数组的指针,我要指向的是整个数组,即&temp,如果你只用temp表示指向的是temp的地址,虽然这两个数值一样但是你用sizeof去测一下就会发现大小不同,证明&temp是整个数组的地址,只是因为开头的地址和temp重合罢了。

教徒 发表于 2020-3-18 14:45:36

叫我miniQ 发表于 2020-3-6 02:55
首先你要知道(*p)是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a的地址 ...

问一下大佬 ,关于(*p + 2)这里,小甲鱼在指针与数组一节中讲到,(*(p + 1)) 和(*p + 1)明确不同,在讲课示例中有说(*p + 1)是将它的地址加 1 ,指针加 1 是(*(p + 1)),是指向数组的下一个元素。
按照这样来说,(*p + 2)应该是将 p 的地址加 2 吧?为什么会是temp的地址呢?这里为什么不是写作(*(p + 2))呢?谢谢

叫我miniQ 发表于 2020-3-18 16:43:27

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

叫我miniQ 发表于 2020-3-18 16:44:22

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

在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不

教徒 发表于 2020-3-18 20:48:21

叫我miniQ 发表于 2020-3-18 16:44
在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不

看到了,很清楚,感谢大佬,可以看懂了,谢谢谢谢
页: [1]
查看完整版本: 数组指针问题