当前位置: 首页 > 知识库问答 >
问题:

*(&arr+1)-arr如何提供数组大小[重复]

东方俊明
2023-03-14
int arr[] = { 3, 5, 9, 2, 8, 10, 11 };      
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;

我不知道这是怎么回事。所以任何人都可以帮我做这件事。

共有1个答案

颛孙玉石
2023-03-14

如果我们将数组与指针一起“绘制”,它将如下所示:

+--------+--------+-----+--------+-----+
| arr[0] | arr[1] | ... | arr[6] | ... |
+--------+--------+-----+--------+-----+
^        ^                       ^
|        |                       |
&arr[0]  &arr[1]                 |
|                                |
&arr                             &arr + 1

表达式&arr&arr+1的类型是int(*)[7]。如果我们取消引用这些指针中的任何一个,我们将得到int[7]类型的值,并且与所有数组一样,它将衰减为指向其第一个元素的指针。

因此,我们使用指向&arr+1的第一个元素的指针(取消引用实际上使这个UB,但仍然适用于任何正常的编译器)和指向&arr的第一个元素的指针之间的差异。

所有指针算术都是在指向类型的基本单元中完成的,在本例中是int,因此结果是指向的两个地址之间int元素的数量。

了解数组将自然衰减为指向其第一个元素的指针可能很有用,即表达式arr将衰减为&arr[0],其类型为int*

此外,对于任何指针(或数组)p索引i,表达式*(p+i)正好等于p[i]。因此*(&arr+1)实际上与(&arr)[1]相同(这使得UB更加可见)。

 类似资料:
  • 我不知道这是怎么运作的。所以任何人都可以帮我。

  • 当我像下面这样写的时候 我可以得到这个输出。 输出 我认为test[0]=100->test[0]^1=101,但它不是。 你能解释一下有什么不同吗?

  • Arr 类别是一系列与阵列协作的辅助函式。 is_multi($arr, $all_keys = false) is_multi 方法检查传递的阵列是否是多维阵列。 静态 是 参数 参数 预设 描述 $arr 必要 要检查的阵列。 $all_keys false 检查所有元素都是阵列。 回传 布林 範例 // 单一阵列 $arr = array('one' => 1, 'two' => 2); e

  • 本文向大家介绍实例分析Array.from(arr)与[...arr]到底有何不同,包括了实例分析Array.from(arr)与[...arr]到底有何不同的使用技巧和注意事项,需要的朋友参考一下 写在开头: 在正文开始之前我们先说明一下类数组(估计大家一定不会陌生) 类数组的特点 1.有索引 2.有长度 3.是个对象 4.能被迭代 特点说明:对于类数组的特点前三个我就不做说明了哈,主要就是最后

  • 刚从C开始,我想知道是否有人能解释一些事情。 我相信你可以用下面的方法初始化一个字符数组 这将创建一个字符数组,其值为。 但如果我真的创造了这个: 会创建一个数组,以及指向该数组的指针吗? 例如:将指向内存中的第一个元素,以及数组中的其他元素?

  • 对于那些不知道_. allKeys(obj)做什么的人,这里有一个片段 因此,它返回传递给它的对象的属性/方法名称数组。 这应该给我: 属性名称:firstname 值名称:John ------ 属性名称:lastname 值名称:Adams ------ 相反,它给了我: 属性名称:firstname 值名称:un定义 ------ 属性名称:lastname 值名称:un定义 ------