黑马程序员技术交流社区

标题: C语言数组a与&a的区别 [打印本页]

作者: JiangHG    时间: 2015-3-13 22:03
标题: C语言数组a与&a的区别
先看代码:
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

作者: 舒少勇    时间: 2015-3-17 08:10
明白了 谢谢
作者: yafengxn    时间: 2015-3-17 09:28
总结的不错
作者: 梦想中前行    时间: 2015-3-17 09:57
不错哦。




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