黑马程序员技术交流社区
标题: 发现了一点有意思的东西,会的来解答下 [打印本页]
作者: black747521 时间: 2015-11-7 13:51
标题: 发现了一点有意思的东西,会的来解答下
#include <stdio.h>
int main(){
int a[5]={1,2,3,4,5},*p=a;
printf("%d\n",*(p+2));
printf("%d\n",(p+2)[2]); // 这行是什么意思,为什么可以打印出来5
return 0;
}
作者: 勇猛的小黑 时间: 2015-11-7 15:29
我感觉,p+2 指向了 第二个元素,,然后把后边的剩余的元素弄成了一个数组(p+2)[2] 代表了第三个元素即5.
作者: 勇猛的小黑 时间: 2015-11-7 15:35
错错错。p+2指向了第三个元素的首地址
作者: black747521 时间: 2015-11-7 16:30
很接近了
作者: 正在输入中... 时间: 2015-11-7 16:41
这个你就要深入理解一下指针和数组啦,其实这个问题很好理解。首先a表示的是数组的首地址,如果要去除里面的值有好几种方式都是等价的。比如你要获取第二个元素(下表为1)。
a[1] 或者*(a+1) 如果理解的透彻的话 [1]a也是可以的。
对数组名称或者指针进行算数操作的时候有两个点需要注意:指针的类型决定每次跳跃的距离。相加的数决定跳跃几次。
比如a+1,a的类型是 int,所以+1之后会跳跃到下一个值。理解了这些的话,再去看你的那个题,就很好理解了。p指向的是a,所以指针p和a的类型是一样的。
*(p+2) 这个就表示 取第三个元素。所以值为3
(p+2)[2]); 这个首先看p+2,跳到了第三个元素,然后【2】表示也是+2的意思就是取第五个元素,自然就是5了。
作者: black747521 时间: 2015-11-7 16:58
赞 清楚透彻
作者: Morning_jcg 时间: 2015-11-7 17:14
本帖最后由 Morning_jcg 于 2015-11-7 17:15 编辑
结构上,a[2]和*(a+2)是一样的,,或者说a[2]其实就是通过*(a+2)来实现的。
作者: yanggangcl 时间: 2015-11-7 19:32
学习了!!!!!!
作者: 李凯666 时间: 2015-11-8 14:34
我认为是p+2指向的是第三个元素,也就是假使这个数组的首地址,那么输出的(p+2)[2]就是他的第5个元素了
作者: 勇猛的小黑 时间: 2015-11-9 13:46
666666666666
作者: 李坤小太阳 时间: 2015-11-9 14:10
p+2 指向了 第3个元素,,然后把后边的剩余的元素弄成了一个数组(p+2)[2] 代表了第三个元素即5.
作者: 陌忆 时间: 2015-11-9 15:56
指针都是算计
作者: Marlong 时间: 2015-11-9 23:06
表示指针还没看呢
作者: 正在输入中... 时间: 2015-11-10 23:52
那应该早点看,嘿嘿、哪里还是比较容易晕的。。。。一定要挺住
作者: 陆露 时间: 2015-11-11 22:32
(P+2) = P ;
作者: 865393462 时间: 2015-11-11 22:36
6666666666666
作者: Venus_1991 时间: 2015-11-12 08:19
66666666666
作者: 许本亮 时间: 2015-11-12 08:55
(p+2)[],首地址为p+2的数组,这里p+2指向3,则(p+2)[0]->3,(p+2)[1]->4,(p+2)[2]->5
作者: caiyilong1992 时间: 2015-11-19 18:44
6666666666666666666666666666666666666666666666666666
作者: 能不能行 时间: 2015-11-19 18:57
真是666666
作者: 一曲繁华尽 时间: 2015-11-19 19:04
P指向了a[0]的地址
(p+2)=&a[2]
(p+2)[2]相当于一个数组首地址是a[2] 所以它的值是a[4]
作者: 红龙果 时间: 2015-11-19 19:47
999999999999999999999999
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |