变量类型如何影响 C 中的指针运算?

How do variable types affect pointer arithmetic work in C?

我无法理解指针的算法。

int B=0, *p=&B, **V=&psizeof(int)=4, sizeof(*int)=8

指令(*V)[1]有什么作用? 对我来说,我看到的是 (*V)[1] 是等价的 *(*V+1),所以应该发生的是,我们 dereference V(这是一个指向一个指针的指针int) 并将 1 与该变量的内容相加,该变量是一个地址。该变量是一个指针,我们假设 sizeof(*int)=8,因此理论上我们应该将 1 * sizeof(*int)(即 8)与指针 V 指向的指针 p 中存储的任何地址相加。

但是,解决方案是求和 4 (1 + sizeof(int))。是我的想法错了还是我的想法错了?

(*V)[1] 确实等同于 *(*V+1).

由于V&p(通过初始化),*Vp。所以我们有 *(p+1).

请注意 *Vp 的类型都是 int *。他们指向一个int,所以p+1指向“下一个”int

由于 p 指向 B(通过初始化),而 B 是单个 intp+1 指向 B 的末尾=24=](如果我们有一个 int 的数组而不是单个 int,那么“下一个整数”就是这里)。

指针允许使用“刚好超过 B 的末尾”,这是您的源引用的解决方案 (*V)[1] 有效地将四个字节添加到该位置的位置*V 指向。

但是,虽然允许引用 B 末尾的对象,但 C 标准并未定义尝试访问那里的对象的行为。 (*V+1) 是定义的指针,但 *(*V+1) 不是该位置对象的定义表达式。它的行为没有被 C 标准定义。

您参考的方案是正确的。

表达式 *V 的类型为 int *,因此它指向一个包含 1 个或多个 int 的数组。因此,因为它指向 int,当发生指针运算时,它指向的数据类型的大小(sizeof(int),即 4)乘以给定值(1)。因此,如果您要打印 *V*V + 1 的值,您会发现它们相差 4.

然而 (*V)[1] 存在问题,相当于 *(*V + 1)。由于 *V 指向 B*V + 1 指向 B 之后的一个元素。这是合法的,因为指针可以指向数组末尾之后的一个元素(或者等同于被视为大小为 1 的数组的单个对象)。然而,合法的是取消对该指针的引用。这样做会调用 undefined behavior.