首页 > 试题广场 >

下面代码会输出_[$##$]__。 int a[4]={1,

[填空题]

下面代码会输出_1__。
int a[4]={1,2,3,4};
int *ptr=(int*)(&a+1);
printf("%d",*(ptr-1));



 &a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 4*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的
首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一
个数组的首地址。所以输出2
*(ptr-1): 因为ptr 是指向a[3],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[3] ,
输出4。
发表于 2019-06-04 15:22:09 回复(0)
&a+1是整个数组的指向棏下一个地址,所以减一就是从下一个地址(随机地址)回到数组的最后一个数存储的地方
发表于 2019-03-03 16:47:06 回复(0)