c - 变量类型如何影响 C 中的指针算术工作?

标签 c pointers pointer-arithmetic

我无法理解指针的算术。

int B=0, *p=&B, **V=&psizeof(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/

相关文章:

python - 将 DHT22 传感器数据上传到 Xively Feed

c - C 中的快速布隆过滤器 - 64 位整数,高频初始化/查询/销毁循环

c - OpenCL:GPU 上的类型转换

C# 指针与 C++ 指针

c - 对于数组,为什么 a[5] == 5[a]?

c - 从内存缓冲区设置结构体的 int

跨平台访问 C 常量

c - 如何打开具有两个不同端口的 UDP 套接字?

c - 释放被覆盖的指针

c - 指针算术和导航 malloc 数组