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

C语言指针数组访问疑问:arr[2]与*(arr+2)等价时指针的作用

为什么C语言里数组访问用指针算术(*(arr+2))而不是下标(arr[2])?

首先明确:arr[2] 和 *(arr+2) 在C标准里是完全等价的——C语言定义数组下标运算符 [] 就是指针加法和解引用的语法糖,编译器会把这两种写法编译成完全相同的机器码,不存在性能差异。

那指针算术的写法到底有什么意义?主要是这几个场景:

  • 遍历数组的灵活性
    当你不需要数组下标值,只是需要逐个访问元素时,指针自增的写法更简洁。比如遍历字符串:

    char *str = "hello";
    while (*str != '\0') {
        putchar(*str);
        str++;
    }
    

    这种写法不需要额外维护一个i变量,代码更紧凑,尤其在处理动态分配的数组、链表或者需要跳过部分元素时(比如str += 3直接跳到第4个字符),比arr[i]的写法更直观。

  • 处理无类型或转换后的指针
    对于void*这种没有大小信息的指针,下标写法buffer[4]是非法的(编译器不知道要偏移多少字节),必须先转换为具体类型再用指针算术:

    void *buffer = malloc(1024);
    // 访问第5个字节(偏移4字节)
    unsigned char byte = *(unsigned char*)(buffer + 4);
    

    这种场景下指针算术是唯一可行的写法。

  • 贴近C的内存模型
    数组在C里本质是一块连续的内存区域,数组名arr本质是指向首元素的指针(注意不是指针变量,是右值指针)。用*(arr+2)的写法能让你更直观地理解:你是在首元素地址的基础上偏移2*sizeof(int)字节,然后解引用获取值——这能帮你更深刻理解C语言的内存布局,而不是把数组当成一个黑盒容器(像Python/Ruby里的列表那样)。

  • 代码风格与习惯
    在底层编程(比如嵌入式、操作系统内核)或者老的C代码里,指针算术的写法更常见,这是历史习惯延续下来的——早期编译器优化能力有限时,程序员可能更倾向于用指针写法,但现在编译器的优化已经完全抹平了两者的差异,更多是风格选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:45:56