A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ench44 中级黑马   /  2014-10-22 00:17  /  1411 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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); 又改如何理解啊....头晕
请问这里输出的是什么...为什么?

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

7 个回复

倒序浏览
这个讲不清楚,好绕的。自己还要理一理。
回复 使用道具 举报
第一个*(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])
回复 使用道具 举报
(&a + 1) 先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址。  (int*)(&a + 1) 把这个相邻地址显式类型转换为int类型的地址  int *ptr1 = (int*)(&a + 1);  定义一个int指针变量ptr1,并让它指向通过显式类型转换取到的这个地址。
回复 使用道具 举报
兵临城下 发表于 2014-10-22 09:15
(&a + 1) 先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址。  (int*)(&a + 1) 把这个相邻地 ...

谢谢谢谢...我还得再去补一下...
回复 使用道具 举报
我觉得 兵临城下 说的不是很清楚,我自己算了一下,发现如果增加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,   
回复 使用道具 举报
兵临的我看懂了但是有个问题
回复 使用道具 举报
米匠 中级黑马 2014-10-23 09:36:07
8#
应该是    2,1  吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马