先看代码:
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
|
|