数组指针问题
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)
这个用了两次取值运算符的代码和正常的有什么不同
请大神给详细解释一下 首先你要知道(*p)是一个数组指针,他指向的是数组的地址,所以第一层取值取*p出来的是数组a的地址,例如第一层的(*p+2)实际上是temp的地址,再取一次值才是temp的内容。
这个问题如果搞不懂,证明你数组的指针表示方法肯定不会,建议巩固一下数组的指针表达方法不然后面一复杂起来就晕了 我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了 兄弟来学习 发表于 2020-3-6 08:29
我有一点不懂,数组名不也是地址吗,为什么把第二行的&去掉就报错了
你说的很对,数组名确实是地址,但是这里是指向数组的指针,我要指向的是整个数组,即&temp,如果你只用temp表示指向的是temp的地址,虽然这两个数值一样但是你用sizeof去测一下就会发现大小不同,证明&temp是整个数组的地址,只是因为开头的地址和temp重合罢了。 叫我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))呢?谢谢 !!!!!!我才发现我这里写错了,实在不好意思,误导到你了。
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),括号的优先级是最高的,所以他会先默认跨一整个数组的地址长度再取地址。举个🌰temp{1,2,3},你直接*(p+1)实际上是指向了这个数组最后一个元素的后一个地址(跨度为整个数组),你可以自己尝试用编译器打印一下地址。
不知道这样你能不能理解,如果我有说错的地方你也可以提出来
教徒 发表于 2020-3-18 14:45
问一下大佬 ,关于(*p + 2)这里,小甲鱼在指针与数组一节中讲到,(*(p + 1)) 和(*p + 1)明确不同 ...
在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不 叫我miniQ 发表于 2020-3-18 16:44
在楼上回复你了,没有点到回复,直接点到了回帖,你看看还有问题不
看到了,很清楚,感谢大佬,可以看懂了,谢谢谢谢
页:
[1]