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

C语言中*(pointerFunc + i)指针操作的原理及执行过程问询

int * func()
{
    static int array[10];
    int i = 0;
    while(i<10){
        array[i] = i + 1;
        i++;
    }
    return array;
}

int main()
{
    int *pointerFunc;
    pointerFunc = func();

    for (int i = 0; i < 10; i++ ) {
      printf("*(pointerFunc[%d]) : %d\n", i, *(pointerFunc + i));
    }

    return 0;
}

我编写了一个创建数组的函数,在main函数中想要打印该数组的所有元素,于是使用指针获取函数内数组的访问权限。代码可正常运行,但我无法理解其中的指针操作逻辑,具体想知道printf语句中的*(pointerFunc + i)如何工作?它能打印数组所有元素,但我不清楚原理,也想知道此时指针的指向是什么。


1. pointerFunc的指向

func里的array是static修饰的数组,它存在静态存储区,不会随函数执行结束被销毁。return array返回的是这个数组的首元素地址(即&array[0]),所以main中的pointerFunc最终指向array数组第一个元素的内存地址。

2. *(pointerFunc + i)的工作原理

这是C语言指针算术运算的核心逻辑:

  • 指针加法不是数值累加:pointerFunc是int*类型,执行pointerFunc + i时,编译器会自动计算偏移量:i * sizeof(int)。比如int占4字节的话,pointerFunc + 1会向后跳4字节,正好指向数组的下一个元素。
  • pointerFunc + i等价于&array[i],也就是数组第i个元素的内存地址。
  • 前缀的*是解引用操作,作用是读取该地址上存储的数值,也就是array[i]的值。

额外补充:语法等价性

C语言中,数组下标语法pointerFunc[i]就是*(pointerFunc + i)的语法糖,两者完全等价。你代码里printf的第一个参数*(pointerFunc[%d])是多余的——pointerFunc[i]已经是数值,再解引用会触发编译警告,改成pointerFunc[%d]或者*(pointerFunc + %d)才是正确写法。

内容的提问来源于stack exchange,提问作者Reise Thomas Kato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:47:57