首页 > 试题广场 >

在gcc环境下,已知数组int arr[5]={1,2,3,

[单选题]
在 gcc 环境下,已知数组 int arr[5]={1,2,3,4,5}; 则 *(*(&arr+1)-1) 的结果为
  • 1
  • 0
  • 4
  • 5

答案是 D & 是取地址符, &arr 代表整个数组,它的步长是整个数组所占的字节数, &arr 的类型是 int * [5] ,所以 &arr+1 指向数组 arr 最后一个元素的下一个地址, *(&arr+1)-1 则是指向 arr 最后的元素,所以 *(*(&arr+1)-1) 的值是 5.


发表于 2016-12-27 16:59:53 回复(3)
一般情况下arr代表的是数组首元素的地址,而&arr代表的则是数组的地址。 虽然数组首元素地址与数组地址的内存地址相同,但对他们进行运算时结果却不同。
给arr和&arr+1所得的结果是不同的,&arr+1刚好比arr+1大16,是4个字节的长度,这时因为arr代表的是数组首元素的地址,加1的话,前进一个元素,也就是4个字节,而&arr代表的是数组地址,加1则跳过整个数组。
发表于 2020-08-10 10:24:59 回复(0)
int arr[5]={1,2,3,4,5};在这个数组的定义中,通常的理解arr是数组的地址即数组首元素的地址,进一步理解arr是一个int型的指针常量,常量+1地址偏移sizeof(int),所以arr+1是首元素下一个元素的地址;考虑到这一层就不难理解&arr的含义,&arr是对arr取地址,结果也是个地址,只是这个地址的类型是指向有5个int类型数据的数组的指针常量,这个常量+1地址偏移5*sizeof(int),对&arr+1解引用后指针常量的类型降级成了int指针类型,再+1则偏移sizeof(int)的量。借助二维数组可以很好的理解。
发表于 2022-04-15 21:02:31 回复(2)
本身arr代表的是数组首元素地址,&arr是取出整个数组的地址,那他就相当于一个指针变量里存放一整个数组的地址,如何把一个数组的地址都存进去呢?就是把数组每个元素的地址,变成一个指针数组,再放在这个指针变量中,所以这个变量也就是二级指针,这样说其实很抽象,大家可以看图来理解。既然&arr是一个二级指针,加一就是跳过的一个数组,我们还需要知道内存是紧挨这存储的,所以&arr+1指向的就是这里,但是实际就是5的地址后面的地址,因为是跳过一整个数组的地址,*(arr+1)就是解引用,取到的是一级指针,也就是5后面的地址,*(arr+1)- 1 就是对这个地址减1,减少的就是sizeof(int)的大小,就是5的地址,再解引用就是5了。
这是我的理解,尽力了
发表于 2023-11-22 17:14:48 回复(1)
#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int arr1[5] = { 0,2,4,6,8 };
	
	cout << &arr << ' '<< &arr1 << endl;
	cout << &arr + 1 << ' ' << &arr1 + 1 << endl;
	cout << *(&arr + 1) << ' ' << *(&arr1 + 1) << endl;
	cout << *(&arr + 1) - 1 << ' ' << *(&arr1 + 1) - 1 << endl;
	cout << *(*(&arr + 1) - 1) << ' ' << *(*(&arr1 + 1) - 1) << endl;
	return 0;
}
运行结果如下,&arr + 1 是 &arr 向后移动整个数组所占字节数(5 x 4 = 20)得到的地址,&arr + 1 的值和 *(&arr + 1)的值相等,*(&arr + 1) - 1 是  *(&arr + 1)向前移动4个字节得到的,因此*(*(&arr + 1) - 1)的值为数组中最后一个元素的值,代码中给出了两个整型数组,运行后得到的结果都是数组中最后一个元素的值。

编辑于 2021-04-09 10:36:03 回复(2)
&arr + 1 的值和 *(&arr + 1)的值相等  这个问题的解析:
arr在c++/c 中作为数组名,退化为指针,通过& 运算符,可以认为是二级指针
对于二级指针  可以看作为 arr[ ][ ] 二维数组,所以   arr[0]与arr相同。
发表于 2022-04-06 22:20:01 回复(0)
一般情况下arr代表的是数组首元素的地址,而&arr代表的则是数组的地址。 虽然数组首元素地址与数组地址的内存地址相同,但对他们进行运算时结果却不同。
发表于 2020-12-16 10:15:08 回复(0)

步骤解析 *(*(&arr+1)-1) 如下:

  1. &arr:取数组 arr 的地址,得到指向数组的指针,类型为 int (*)[5]。
  2. &arr+1:对指针 int (*)[5] 执行加法操作,指针会向后移动 sizeof(arr) 字节,即指向数组 arr 后的位置。
  3. *(&arr+1):取移动后位置的值,即指向数组 arr 后的位置的指针,类型为 int*。
  4. *(&arr+1)-1:对指针 int* 执行减法操作,指针会向前移动 sizeof(int) 字节,即指向数组 arr 的最后一个元素的位置。
  5. *(*(&arr+1)-1):取移动后位置的值,即指向数组 arr 的最后一个元素的指针解引用,得到数组 arr 的最后一个元素的值。

所以,*(*(&arr+1)-1) 等价于 arr[4],即数组 arr 的最后一个元素,结果为 5。

发表于 2023-11-30 23:01:49 回复(0)
二级指针,&arr代表整个数组,加一跳过数组。一级解引用获得指向尾后元素的指针,减一再解引用得到5
发表于 2022-03-27 12:44:47 回复(0)
可能看起来有点绕,a是指针,&a得到地址,**(&a)其实是对地址的两次解引用,还是指针指向的值
发表于 2020-08-07 00:18:10 回复(1)
`&arr` 是一个指向数组 `arr` 的指针,这里的数组 `arr` 是一个包含5个整数的数组。`&arr+1` 这个操作将指针 `&arr` 向后移动一个 `arr` 数组的大小,也就是移动了 `5 * sizeof(int)` 的距离。

`*(&arr+1)` 将得到这个新的位置的值,但是因为我们已经超出了数组 `arr` 的边界,所以这个值是未定义的。但是,你再做 `-1` 操作,即 `*(&arr+1)-1`,这个操作将指针向前移动了 `1 * sizeof(int)` 的距离,所以这个指针现在指向的是数组 `arr` 的最后一个元素。

所以,`*(*(&arr+1)-1)` 最后将得到 `arr[4]`,即 `5`。
发表于 2023-05-30 23:15:03 回复(0)
*(&arr+1)不是对数组最后元素的下一个地址提领吗,为什么还是地址啊
发表于 2022-08-01 10:21:35 回复(0)
蹲一下 大佬求解🆘&arr+1 和*(&arr+1) 值相等的原因
发表于 2022-04-05 16:48:06 回复(0)