首页 > 试题广场 >

下面程序的输出是什么?

[单选题]
下面程序的输出是什么?
int main(void) {
     int a[5] = {1, 2, 3, 4, 5};
     int *ptr = (int *)(&a + 1);
     printf("%d %d", *(a + 1), *(ptr - 1));
     return 0;
 }
  • 2 1
  • 2 5
  • 1 2
  • 5 2
推荐
应该是2,5, ptr指的是整个数组的地址
编辑于 2015-07-20 10:59:27 回复(4)
1.*(a + i) == a[i];
2.主要要理解“数组的地址”和“数组首元素的地址”是两个不同的概念
&a就是数组的地址,&a+1就相当于加一个数组,即偏移一个数组。
注意理解两个步长。
*(a + 1),中的1为元素。
*(ptr - 1))中的1为数组。
 
发表于 2015-02-26 13:41:39 回复(11)
NWU头像 NWU
*(a+1)就是a[1],输出为2。这个不难,关键在于(&a + 1)的分析。
大家都知道,指针+1所得结果要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以第四行语句执行后,ptr指向a[5];最后输出时,即*(ptr - 1)时,ptr为int型指针,则-1操作减少sizeof(int *),指向a[4],输出为5。

发表于 2016-01-06 20:55:02 回复(3)
a是数组首元素的地址,a+1的步长是int,所以是2
&a是数组的首地址,&a+1步长是int[5]
ptr是int类型的指针,指向a数组的尾后位置,ptr-1的步长是int,所以是a数组的最后一个元素 5

发表于 2017-05-02 22:31:05 回复(0)
发表于 2020-03-15 19:36:44 回复(0)

一个指针它由 2 个要素组成:

(1)指针的值。也就是地址,更通俗的说就是指针所指的东西在哪

(2)指针的类型。也就是指针所指的东西是什么,编译器就是依据指针的类型,来对指针所指的那块内存进行解释的。也正是这个类型,决定了对一个指针执行 +1 操作时,指针到底该偏移多少个字节。

int a[5] = { 1, 2, 3, 4, 5 };
auto *p1 = a;  // auto是C++11特性
auto *p2 = &a;
cout << p1 << " " << p2 << endl;
cout << *(p1 + 1) << " " << *((int*)(p2 + 1) - 4) << endl;

上述程序执行时,你会发现p1p2打印的内容完全一致,这只能说明它们的第一个要素相同。事实上它们的第二个要素,即指针的类型不同,p1 指向的内存是一个 int,大小 4 字节;p2 指向的是一个 int[5] 数组,大小 4 * 5 = 20 个字节。理解了这些,其他就很好理解了,比如为什么*(p1 + 1)得到 2,*((int*)(p2 + 1) - 4)得到的也是 2。

编辑于 2020-03-28 22:53:12 回复(0)

&a==a

&a+n==a+n*sizeof(a)

a+n==a+n*sizeof(a[0])

sizeof(a)==数组长度*sizeof(*a)==数组长度*(a[0])

sizeof(&a)==sizeof(int (*)[])==4  (x86的指针长度)


type *p;

...

p+n—>p+n*sizeof(*p)


type x;

&x+n—>&x+n*sizeof(x)


不过上面的仅供记忆,实际上(当然不同操作系统/编译器也可能会有影响)不同类型的+1或+n生成的汇编代码和机器码是不同的。而sizeof的实现恰恰是基于+1操作的,而不是反过来,有兴趣可以自行搜索


发表于 2018-07-30 18:44:09 回复(0)

&a+1的地址其实是a+5一样


发表于 2018-08-18 16:52:48 回复(0)
*(a+i) = a[i]
&a为数组的地址,&a+1为偏移一个数组
发表于 2018-12-27 10:06:35 回复(0)
a不仅仅只数组a[5]数组元素的首地址,也是int [5] 数据类型的地址,所以(&a + 1)前需要强制类型转化。这道题错的不亏
有时候数组名说成数组元素的首地址,其实说的是地址的值相等,数组名和元素首地址在地址运算中还是有所不同。
编辑于 2018-10-10 11:21:41 回复(0)
&a+1
取a的地址加上1 , 什么意思???
发表于 2015-01-08 17:52:18 回复(1)

这是个很有趣的题目
sizeOf(a) = 20,&a+1,故向后进了20个字节,即prt指向了下一个数组的首地址(只为了方便理解).
prt 是 int*,sizeOf(prt) = 4, prt-1 故前退四个字节,也就指向了5.
*(a+1) = a[1] = 2;

编辑于 2022-03-10 23:17:54 回复(0)
是指针步长的问题。ptr先是取了整个数组的地址+1这是步长为5(假设是1字节),之后强制转换为int*之后步长变为1。相当于ptr指向a数组后面的一个地址。-1后只移动一个步长,所以变成指向a数组最后一个数,即为5
发表于 2017-07-23 09:22:59 回复(0)
&a指的是整个数组的地址
发表于 2017-07-05 12:46:10 回复(0)
加一个数组和加一个数值的区分 &a是数组指针 类型是int(*)[5] &a+1是指a[5]
编辑于 2016-07-06 14:33:39 回复(0)
对数组a取地址再加1,相当于加了整个数组的长度,所以ptr就指向了数组的末尾
发表于 2015-11-30 00:12:38 回复(0)
这道题里,对a取地址,在实际执行中,打印的地址值,与a相同(&a == a)。但切实影响到了ptr的值,也即,不取地址符时,a+1表示的是偏移一个元素;取地址符后,&a+1表示的是偏移一个(int [5])。也就是说,这更像是编译器在理解代码时,做出的不同判断。

编辑于 2023-12-21 21:44:44 回复(0)

解析如下:

  • 定义了一个整型数组a,包含5个元素。
  • 创建了一个指针ptr,并将其指向数组a的末尾之后的位置。这里使用了 C 语言中的指针运算,在指针加1时,它会移动到下一个相同类型的元素位置。

接下来是输出部分:

  • *(a + 1) 表示访问数组a的第2个元素,即2。
  • *(ptr - 1) 表示访问指针ptr的前一个位置的值,即数组a的最后一个元素,即5。

所以,最终输出为 "2 5"。

发表于 2023-10-18 19:42:17 回复(0)
(&a + 1),因为&a=a[0]=1,数组加1即加上数组的步长,因为数组是int型的,所以1+4=5,所以*ptr=5
*(ptr-1)=4,所以输出a[4]
发表于 2017-09-26 16:58:44 回复(0)
&a+1是代表a数组又拓展了一个空间!
发表于 2023-02-13 20:43:35 回复(0)
# include<stdio.h>
# define _CRT_SECURE_NO_WARINGS
int main() {
    int* p;
    int arr[5] = { 1,2,3,4,5 };
    p = &arr + 1;
    int* m;
    m = arr + 1;

   printf("%d %d", *(p-1),*m);

        return 0;
   
}
发表于 2022-09-23 17:28:36 回复(0)