首页 > 试题广场 >

下面代码会输出什么?

[单选题]
下面代码会输出什么()
int main(int argc, char **argv)
{
    int a[4] = {1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));
}

  • 1
  • 2
  • 3
  • 4
推荐
D
&a是数组指针,其类型为int(*)[4];
而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为4的int数组指针,所以要加5*sizeof(int),所以ptr实际是a[4],但是ptr与(&a+1)类型是不一样的,这点非常重要,所以ptr-1只会减去sizeof(int*),a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[4]
编辑于 2015-01-26 18:19:27 回复(11)
答案:D
其实测试可以发现,a 和 &a 是同一个地址,printf("%d", a),printf("%d", &a)结果是相同的。
但是其代表的含义不同,*(a+1)代表从a数组首地址跳跃一个int的长度,*(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr - 1)表示a数组的最后一个元素。
发表于 2015-01-28 11:26:33 回复(5)
这边主要考察的是数组指针和数组首地址的问题。
&a是数组指针,a是数组首地址。
而指针的+1,增加的是1个指针类型的长度。比如&a是数组指针,(&a + 1)增加的是1数组的长度
所以题目中第四步的ptr指向的是a[4]的位置。
(ptr - 1)减少的是1个数据元素的长度。第五步ptr指向的是a[3],页就是4
发表于 2016-09-05 20:54:47 回复(0)
a 和 &a 是同一个地址。但是其代表的含义不同,*(a+1)代表从a数组首地址跳跃一个int的长度,*(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr - 1)表示a数组的最后一个元素。
发表于 2015-07-21 22:02:46 回复(4)
经过实验可得,a和&a的地址完全一样,但是(a+1)和(&a+1)和含义却完全不同,a+1是在a的地址上加了一个int的字节数,而&a+1则是在a的地址上加了一个int a[4]的字节数
编辑于 2021-10-27 22:07:01 回复(1)
int 类型的指针,从一个地址接下一个地址之间偏移量是 4个字节;
而数组指针,从一个地址接下一个地址之间偏移量是该数组的长度。
发表于 2018-12-07 15:08:35 回复(0)
数组a【3】[4],其中数组名a是指向一维数组的,&a是指向二维数组的,*a是指向单个数组元素的
发表于 2022-06-24 22:39:28 回复(0)
*(a+1)代表从a数组首地址跳跃一个int的长度,*(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr - 1)表示a数组的最后一个元素。
发表于 2016-07-06 10:17:21 回复(0)
&a,是对整个数组取地址,&a + 1,加的1是整个数组的长度
发表于 2015-08-04 20:02:45 回复(0)
经过实验可得,a和&a的地址完全一样,但是(a+1)和(&a+1)和含义却完全不同,a+1是在a的地址上加了一个int的字节数,而&a+1则是在a的地址上加了一个int a[4]的字节数
发表于 2022-04-29 16:36:11 回复(0)
a数组首元素地址,a+1下一个元素地址(比a多4个字节);&a 整个数组的存储地址,&a+1一次移动一个数组存储大小的地址。int *ptr表示a最后一个元素的下一个位置,*(ptr-1)则表示该数组最后一个元素4
编辑于 2024-03-28 15:19:56 回复(0)
int a[4];&a代表的是数组指针,类型为int (*)[4] 因此a++代表跨越整个数组的长度
发表于 2022-03-04 09:44:16 回复(0)
*(a+1)代表从a数组首地址跳跃一个int的长度, *(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr- 1)表示a数组的最后一个元素。
发表于 2021-10-27 12:19:19 回复(0)
指针的类型,一个是int型指针,为4。一个是数组指针,int *[4].
发表于 2021-08-11 23:26:41 回复(0)
&a是int *[4]类型的数字指针,指向a[4]这个数组的首地址, 所以&a+1实际上是移动了一个数组的长度指向该数组的后面 (int *)(&a+1)将指向该数组的数组指针转换为int*类型, 而后(ptr-1)此时指向的就是数据4的地址
发表于 2021-06-10 19:58:57 回复(0)
&a+1 数组名的地址加1,加的是整个数组长度的字节数
发表于 2021-05-21 09:48:25 回复(0)
&a+1,增加一个原数组的长度。*(p-1)后腿一个元素
发表于 2020-10-24 10:35:04 回复(0)

&a为数组指针,a为首地址

发表于 2020-02-05 12:18:31 回复(0)
*(a + 1)表示移动了一个元素的长度,*(&a + 1)表示移动了一个数组的长度,故*ptr相当于a[4],*(ptr - 1)为a[3],选D。
发表于 2018-11-18 18:11:25 回复(0)
a是数组名。a是数组首元素的地址,&a是整个数组的地址,虽然值相同但是意义不一样。 a代表数组指针,指向4个int类型元素的数组,数据类型是int(*)[4],指针加1,代表指针移动一个数据类型长度,所以有个强制类型转换。a代表数组首元素的首地址,a 数据类型是int *,+1,移动一个数据长度。 a和&a也是常指针,但是指向的数据类型不同。
编辑于 2018-10-29 16:48:48 回复(0)
数组名只有两种情况下表示整个数组 (1)sizeof(arr) (2)&arr 上题中&a表示整个数组,&a+1指向最后一个元素的下一个元素,而*ptr是int类型,所以指针减一,相当于减四个字节指向数组最后一个元素
发表于 2018-09-29 15:39:25 回复(1)