黑马程序员技术交流社区

标题: 指针.......指针....带星就头晕啊 [打印本页]

作者: ench44    时间: 2014-10-22 00:17
标题: 指针.......指针....带星就头晕啊
main()
{int a[5]={1,2,3,4,5};
  int *ptr=(int *)(&a+1);  
  printf("%d,%d",*(a+1),*(ptr-1));
}

分析有限:
(&a +1) ....&a 代表数组a得地址,那么也就是a[0]的地址? 数组中元素得地址是连续的,那么(&a +1)就是a[1]的地址吗?
int *ptr=(int *)(&a+1); 又改如何理解啊....头晕
请问这里输出的是什么...为什么?

作者: 崔石炫    时间: 2014-10-22 00:38
这个讲不清楚,好绕的。自己还要理一理。
作者: 兵临城下    时间: 2014-10-22 09:13
第一个*(a+1),a[5]是一个int类型,那么现在指针a指向的是a[0]的地址,但是这个a每增加1,就移动了4个字节的位置。比方说,a[0]的地址是0x000000,那么a+1的地址就是0x000004,指向a[1].所以第一个输出应该是2;
第二个,输出应该是5;&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以int *ptr=(int *)(&a+1);其实ptr实际是&(a[5]),也就是a+5.
为什么呢?
int a[5]={1,2,3,4,5};
a  指向int的指针
&a 指向int[5]的指针
&a+1 == &a+sizeof(int[5])
作者: 兵临城下    时间: 2014-10-22 09:15
(&a + 1) 先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址。  (int*)(&a + 1) 把这个相邻地址显式类型转换为int类型的地址  int *ptr1 = (int*)(&a + 1);  定义一个int指针变量ptr1,并让它指向通过显式类型转换取到的这个地址。
作者: ench44    时间: 2014-10-22 09:55
兵临城下 发表于 2014-10-22 09:15
(&a + 1) 先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址。  (int*)(&a + 1) 把这个相邻地 ...

谢谢谢谢...我还得再去补一下...
作者: 哈利梅    时间: 2014-10-22 11:26
我觉得 兵临城下 说的不是很清楚,我自己算了一下,发现如果增加20个字节,那就跑出这个数组了,不应该指向a[5],
这个是我自己写的一个地址分析,算了算,发现,增加20个字节,应该是0+20 ——> 0+16+4  ——> 0+f+4 ——>13
那么按照16进制,指针最终指向的应该是0x000013   而a[5]的地址我在下面写出来了,感觉不是指向它,而是跑出了数组之外,不知道分析的对不对,望指正~~
&a+1 偏移了整个数组a的大小(也就是5个int的大小) 也就是4×5=20个字节,例如,a[0]的地址是0x000000, 那么也就是说要增加20,  1对应的应该是0x000000,2对应的是0x000004,3对应的是0x000008,4对应的是0x00000c,5对应的地址是0x000010,   
作者: dream静    时间: 2014-10-22 22:30
兵临的我看懂了但是有个问题
作者: 米匠    时间: 2014-10-23 09:36
应该是    2,1  吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2