首页 > 试题广场 >

执行如下代码后输出结果为( ) i...

[单选题]
执行如下代码后输出结果为()
int main() {
    int a[5]  = {1, 2, 3, 4, 5};
    int *ptr = (int*)(&a + 1);
    printf("%d, %d", *(a + 1), *(ptr - 1));
    return 0;
}
  • 1,1
  • 1,3
  • 3,3
  • 2,5
&a + 1,其中 + 1 偏移的大小为 a 整个数组的大小,即 5 个 int 型的大小;
a + 1,其中 + 1 偏移的大小为 a 中一个元素的大小,即 1 个 int 型的大小;
ptr - 1,由于强制类型转换,此时 - 1 偏移的大小为 1 个 int 型;
发表于 2020-01-27 18:34:44 回复(0)
地址ptr数值本来是a数组的结尾的后一位地址值,减一则为a数组最后一位的地址。
发表于 2018-12-21 18:18:57 回复(2)

代码中定义了一个长度为 5 的整型数组 a,并且给它赋值 1 到 5 的连续整数。接着定义了一个指向整型的指针 ptr,将 a 的地址加上 1,也就是跳过了整型数组 a 的长度,指向了 a 数组之后的内存地址。需要注意的是,由于 &a 是整个数组 a 的地址,所以加上 1 不是访问 a 数组最后一个元素的地址,而是跨越了整个 a 数组,指向了一个未知的地址。因此,ptr 指针只能保证指向了一个合法的内存地址,但不能保证这个地址包含有意义的值或数据。

接着使用 printf 函数分别输出了 a 数组中下标为 1 的元素和 ptr 指针指向的值。a + 1 指向了数组 a 的第二个元素,即整数 2,因此 *(a + 1) 的值为 2。而 ptr - 1 的地址正好指向了数组 a 的最后一个元素,即整数 5,因此 *(ptr - 1) 的值为 5。因此,代码的输出结果为 2, 5。

发表于 2023-06-12 09:02:14 回复(3)
注意 &a的类型是一个指向大小为5的int型数组的指针
所以 +1 是加了sizeof(大小为5的int型数组)

编辑于 2020-03-11 16:07:52 回复(0)
&a为指向数组a首地址的5个int大小的数组指针,&a+1则为数组a首地址+5int内存大小的地址,(int*)将其强制转换为int指针,*(ptr-1)为指向&a+1地址之前的一个int数据,即数组a的最后一位int数据5
发表于 2022-08-22 18:52:18 回复(0)
int *p1 = a;  // p1是指向数组a第一个元素的地址
int (*p2)[5] = &a;  // p2指向一个大小为5的数组
int (*p3)[5] = &a + 1;  // 同p2,相对于p2偏移了4*5=20位

最后return少了一个0

编辑于 2020-10-27 23:12:34 回复(0)
答案设计的不好,确定第一个就可以选了
发表于 2019-12-01 20:07:57 回复(0)
a:指向数组首元素地址的指针。 &a: 指向数组地址的指针。
发表于 2024-04-11 22:30:04 回复(0)
发表于 2023-10-06 23:44:04 回复(0)
发表于 2023-03-17 13:32:06 回复(0)
发表于 2022-05-03 18:25:29 回复(0)
&(a+1)的意思是让指针指向数组后一个地址,以数组大小进行偏移,然后指针-1就是好理解了,*(a+n)= a[n] ,指向当前地址的上一个元素,也就是5
发表于 2020-01-27 14:57:30 回复(1)

不懂啊

发表于 2019-10-07 09:16:27 回复(0)