变量类型如何影响 C 中的指针运算?
How do variable types affect pointer arithmetic work in C?
我无法理解指针的算法。
让int B=0, *p=&B, **V=&p
和sizeof(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
(通过初始化),*V
是p
。所以我们有 *(p+1)
.
请注意 *V
和 p
的类型都是 int *
。他们指向一个int
,所以p+1
指向“下一个”int
。
由于 p
指向 B
(通过初始化),而 B
是单个 int
,p+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.
我无法理解指针的算法。
让int B=0, *p=&B, **V=&p
和sizeof(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
(通过初始化),*V
是p
。所以我们有 *(p+1)
.
请注意 *V
和 p
的类型都是 int *
。他们指向一个int
,所以p+1
指向“下一个”int
。
由于 p
指向 B
(通过初始化),而 B
是单个 int
,p+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.