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

为何int*自增偏移4字节,int**/int***自增偏移8字节?

指针自增偏移量差异解析

测试代码

void intArrayAsPointerPrinter(int iSize){

    int * p = 0;
    int ** q = 0;
    int *** r = 0;
    for(int i = 0; i < iSize; i++) {
        printf("%p %p %p\n", p,q,r);
        p++;
        q++;
        r++;
    }
}

调用输出(传入size=3)

0x0 0x0 0x0
0x4 0x8 0x8
0x8 0x10 0x10

问题解答

指针自增的偏移量根本不是看指针自身的大小,而是由它指向的数据类型的大小决定,这是C语言的核心规则:

  • int* p:指向的是int类型,你当前环境中int占4字节,所以p++会让地址偏移4字节,确保下一次能精准指向相邻的下一个int变量。
  • int** q:指向的是int*类型(也就是一个指针),你使用的是64位系统,指针类型本身占8字节,因此q++需要偏移8字节,才能指向相邻的下一个int*指针变量。
  • int*** r:指向的是int**类型(同样是指针),大小也是8字节,所以r++的偏移量同样是8字节。

你觉得“所有指针自增偏移应该统一”是对指针自增逻辑的误解——指针自增的本质是移动到下一个同类型元素的起始地址,因此偏移量必须匹配它指向的类型的大小,而非指针自身的大小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:17:37