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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JiangHG 中级黑马   /  2015-3-13 22:03  /  964 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先看代码:
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)(a +1);
printf ("*ptr1 = %d *ptr2=%d",*ptr1,*(ptr2-1));
}
要想搞明白程序输出结果就必须搞明白两个问题
1. a与&a的区别
   a 与 &a值是一样的,但表达的意思不一样,a是数组首元素的地址即a[0]元素的地址,而&a整个数组的首地址
2.指针的加减操作
一个类型为t的指针的移动是以sizeof(T)为移动单位,所以 a+1的移动单位是sizeof(a[0])就指向了数组下一个元素的地址即a[1]的地址,(&a+1)的移动单位是5*sizeof(int)就指向了“a[5]”显然已越过了数组界限,而ptr2移动单位是sizeof(int),它向前移动一个单位就正好指向了a[4]
经过以上分析:程序运行结果为 *ptr1 = 2 *ptr2 = 5

3 个回复

正序浏览
不错哦。
回复 使用道具 举报
总结的不错
回复 使用道具 举报
明白了 谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马