首页 > 试题广场 >

执行如下代码后输出结果为( ) 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
int a[5];
(&a + 1) 与 (a + 1)的区别:
&a 是代表数组的地址, 数组的内存是5*size(int) 。 因此&a + 1 是对数组整块内存加1,  即 &a + 5*size(int)。
a代表数组首元素的地址,  数组首元素的大小为size(int),    因此a+1是对整个数组的内存加1, 即 a + size(int)。
总结, &a,a分别是数组的地址、数组首元素的地址, +1是即  数组首元素的内存加1 。

一张图解释:

发表于 2019-11-21 15:17:17 回复(3)
 &a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的
首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一
个数组的首地址。所以输出2
*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,
输出5。

发表于 2019-08-20 16:42:52 回复(2)

a 指的是数组首元素的首地址即a[0]的首地址; 而 &a 指的是数组的首地址

则例子中的(&a + 1)就是取数组 a 的首地址,该地址的值再加上 sizzeof(a) 的值, 即就是 &a + sizeof(int) * 5,也就是下一个数组的首地址,显然这里已经超过了数组的界限。

(a + 1)是指数组的首元素 a[0] 的 下一个元素的首地址即 a[1]的首地址。因此 *(a + 1) 的输出结果是2.

因为 ptr 指向的是 a[5], 并且 ptr 是 int * 类型的,所以 (ptr - 1)指向的就是 a[4], 因此*(ptr - 1) 的输出就为5.

发表于 2021-01-06 22:39:48 回复(0)
已知数组a,a+1:加的是单个元素的量,所以指向数组a首元素的下一元素。&a+1:加的是整个数组的量,所以指向的是最后一个元素后面的那个位置。
发表于 2020-12-24 17:16:04 回复(0)
先对a取指针,相当于地址的指针(**),转化为int类型的指针(*),就相当于把一个一维数组,转换为二维数组此时由上面的一维数组可以知道该二维数组的列为5,行缺省即a[][5],题目中将a取地址之后加一,即表示的是a[1][0]这个地址,然后将这个地址减一,因为地址是连续的,表示的就是他前面的那个地址,即a[0][4],即5
发表于 2022-05-10 21:11:28 回复(0)
注意区分 &a,&a[0],&a+1,&a[0]+1,(int*)(&a+1)
编辑于 2020-03-24 16:16:55 回复(0)