首页 > 试题广场 >

以下代码的输出是()

[单选题]
以下代码的输出是()
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));

  • 1,2
  • 2,5
  • 2,1
  • 1,5
推荐
数组名的值是一个指针常量,也就是数组第一个元素的地址。*(a+1)等同于a[1],*(a+1)=2。
&a+1指向数组最后一个元素的下一个位置,故*(ptr-1)指向数组的最后一个元素。
选B。
编辑于 2015-01-29 11:33:38 回复(5)
B
a 代表的是int * 每次步长为一个int
&a 代表的是 int[]* 每次步长为所指向的数组的大小
ptr 指向的是数组a最后一个元素的下一个元素
所以ptr-1指向的是数组a的最后一个元素
a+1指向的是数组a的第二个元素
所以正确答案是B
发表于 2015-01-20 09:08:37 回复(1)
答案:B (实测)
*(a+1)等价于a[1],也就是2
这里有个特殊的地方,测试代码printf("%d\n",a); printf("%d\n",&a);这两个输出的地址是相同的,也就是&a是把数组看成一个整体,&a+1就是跳过数组的长度指向最后一个数字的下一个整型。*(ptr-1)就在再后退一个整型,也就是数组的最后一个元素。
发表于 2015-01-28 10:24:14 回复(3)

题关键就在于第二个点,*(ptr-1)输出为多少?

解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以int *ptr=(int *)(&a+1);其实ptr实际是&(a[5]),也就是a+5.

原因为何呢?

&a是数组指针,其类型为int(*)[5];

发表于 2015-08-26 22:18:42 回复(0)
对数组名取地址,如&a,得到的是整个数组的地址,虽然从数字上说,和a的值(数组的首地址)相等,但是意义不同
所以,a+1是将地址值加4(一个int占4个字节大小),而&a+1是将地址值加20(数组的大小为4字节*5个int类型的数字)。

发表于 2016-07-13 09:59:16 回复(0)
指针加,指向下一个对象。 T *p = ...; p += i; // p加的是i*sizeof(T)
发表于 2017-03-27 15:44:31 回复(0)
数组名只有在&和sizeof操作符 单独使用时表示整个数组,&a+1表示整个数组向后移一位
发表于 2016-09-20 23:26:22 回复(0)
定义有 int(*b)[];b[0][0]=a 此时可以这样理解&a-1: 即 b[1][0]-1,即b[0][n]
发表于 2018-07-27 19:09:47 回复(0)
(int*)(&a+1)表示指向数组最后一个元素的下一个元素。
发表于 2018-02-20 12:42:56 回复(0)
本题考察指针操作:数组名a为数组首元素地址,&a是数组地址;指针+1时地址偏移多少取决于指针所指对象
编辑于 2018-02-13 12:02:40 回复(0)
&a是数组首元素指针的地址,且步长为数组大小,唯一需要注意的是第二句被强制转换成了普通int指针,所以步长恢复为1
编辑于 2018-01-11 10:29:59 回复(0)
a(数组首地址) 代表的是int *  ,每次步长为一个int,&a 代表的是 int[]* 每次步长为所指向的数组的大小,所以ptr指向数组最后一个元素的下面一个元素。

发表于 2017-03-14 22:04:56 回复(0)
指针的表示以及指针存储。
发表于 2017-02-09 13:31:45 回复(0)
数组的a表示该数组的第一个元素地址,而&a指向这个数组的指针的地址。
发表于 2016-07-12 22:36:37 回复(0)
int*ptr=(int*)(&a+1);
int *ptr= (int*)&a + 1;
这两个是不一样的
发表于 2015-09-05 16:51:28 回复(0)
B
这个题难道不是出现了两次吗
发表于 2015-04-09 13:42:56 回复(0)
答案:B
注意*(a+1)和&a+1的区别。
发表于 2015-03-25 22:18:21 回复(0)
开始还以为是c,原来&a+1是指的是数组最后一个元素的下一个位置
发表于 2015-03-06 08:31:36 回复(1)
我第一次选了C,哎,基础还不扎实啊!
编辑于 2015-02-12 10:52:10 回复(0)
B
发表于 2015-01-12 14:16:30 回复(0)