You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组中*(ptr)与*(ptr+2)解析及指针地址偏移计算疑问

数组指针的算术运算原理

你的疑问核心在于C语言中指针算术运算的规则,下面直接拆解这个问题:

指针加减是「按类型步进」,而非直接操作地址数值

当你对指针做加减操作时,编译器会根据指针指向的数据类型大小,自动计算实际的地址偏移量,而不是把你写的数字直接加到地址上。

在你的代码里:

  • ptr是int*类型指针,指向的是int类型数据
  • 现代系统中int通常占4字节(你的运行结果里地址差值为8,正好是2×4,完全符合这个设定)

所以ptr+2的实际地址计算逻辑是:
原地址 + 2 × sizeof(int)
代入你的地址值就是:-1931225192 + 2×4 = -1931225184,和你看到的运行结果完全匹配。

这种设计的逻辑意义

这套规则是为了让指针操作更贴合数组的使用场景:

  • ptr+1会直接指向数组的下一个元素,而非下一个字节
  • 比如你的数组x中,ptr指向x[2](值为3),ptr+1就指向x[3](值为4),ptr+2指向x[4](值为5),这也对应了你代码里*(ptr+2)输出5的结果。

补充:地址打印的规范写法

你代码里用%d打印地址是不规范的,地址本质是无符号的内存地址值,用%d可能会出现负数(比如你看到的-1931225192),正确写法应该用%p格式符:

printf("address ptr = %p\n", (void*)ptr);
printf("address ptr+2 = %p\n", (void*)(ptr+2));

内容的提问来源于stack exchange,提问作者Jackob2001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:39:59