因此,我最近遇到的事情对我来说并不是很直观,让我有些困惑。如果我像这样在堆上分配一个数组:
uint32_t* Array = new uint32_t[5];
,然后尝试像这样向数组指针添加一定数量的字节:
Array + 3
结果将是Array + sizeof(uint32_t) * 3
,而不是Array + 3
。
为什么要这么做?
答案 0 :(得分:0)
Additive operators (§7.6.6/4) [expr.add]/4:
将具有整数类型的表达式 J 添加或减去 从指针类型的表达式 P 中,结果的类型为 P 。
- 如果 P 评估为空指针值,而 J 评估为0,则 结果是空指针值。
- 否则,如果 P 指向具有 n 个元素的数组对象 x 的元素 x [i] ,表达式 P + J 和 J + P (其中 J 的值为 j )指向(如果 0≤i + j≤n 并且表达式 P-J 指向(如果 0≤i − j≤n ,则可能是假设的元素 * x [i-j] 。
- 否则,行为是不确定的。
Subscripting (§7.6.1.1/1) [expr.sub]/1
后缀表达式后跟方括号的表达式是 后缀表达式。表达式之一应该是类型的glvalue “ T的数组”或“ T的指针”类型的prvalue,另一个应为 是无作用域枚举或整数类型的prvalue。结果是 类型“ T”。类型“ T”应为完全定义的对象类型。 E1 [E2] 表达式(根据定义)与 *((E1)+(E2))相同, 除了在数组操作数的情况下,结果是左值 如果该操作数是左值,则为x值。表达方式 E1 在表达式 E2 之前排序。