我无法理解指针的算术。
让int B=0, *p=&B, **V=&p
和sizeof(int)=4, sizeof(*int)=8
指令 (*V)[1]
的作用是什么?做?
对我来说,我看到的是(*V)[1]
相当于*(*V+1)
,所以应该发生的是,我们取消引用 V(它是一个指向 int 的指针),并将 1 与该变量的内容(它是一个地址)相加。该变量是一个指针,我们假设 sizeof(*int)=8
,所以理论上我们应该求和 1 * sizeof(*int)
(即 8)到指针 V 指向的指针 p 中存储的任何地址。
然而,解决方案是求和 4 ( 1 + sizeof(int)
)。到底是我的想法错了还是错了?
最佳答案
您引用的解决方案是正确的。
表达式*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 .
关于c - 变量类型如何影响 C 中的指针算术工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60400473/