下面代码会输出什么()
1
2
3
4
5
6
|
int
main(
int
argc,
char
**argv)
{
int
a[
4
] = {
1
,
2
,
3
,
4
};
int
*ptr = (
int
*)(&a +
1
);
printf(
"%d"
, *(ptr -
1
));
}
|
答案 4
解析:
这边主要考察的是数组指针和数组首地址的问题。
&a是数组指针,a是数组首地址。
而指针的+1,增加的是1个指针类型的长度。比如&a是数组指针,
(&a + 1)增加的是1数组的长度。
所以题目中第四步的ptr指向的是a[4]的位置。
而
(ptr - 1)减少的是1个数据元素的长度。第五步ptr指向的是a[3],页就是4
解析:
其实测试可以发现,a 和 &a 是同一个地址,printf("%d",a),printf("%d", &a)结果是相同的。
但是其代表的含义不同,*(a+1)代表从a数组首地址跳跃一个int的长度,*(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr- 1)表示a数组的最后一个元素。