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

C语言数组传参:数组下标与指针解引用的疑问

数组下标运算符本质是解引用与指针算术的简写

先看你提供的测试代码:

#include <stdio.h>

void myFunc(int arr[]) {
    // arr is the pointer to the first element in the array

    printf("%d\n", arr[0]);     // prints 1
    printf("%d\n", *arr);       // prints 1
    printf("%d\n", arr[1]);     // prints 2
    printf("%d\n", *(arr + 1)); // prints 2
}

int main () {
    int myArr[] = {1,2,3};
    myFunc(myArr);
}

没错,你猜的完全对——C语言里的数组下标运算符[]就是*(指针 + 偏移量)的语法糖,不管操作的是数组名还是指针,编译器都会把arr[i]转换成*(arr + i)来处理。

你已经注意到数组传参时会退化为指针,在myFunc里的arr其实是个int*类型的指针,但C语言特意允许指针使用下标运算符,本质就是因为这俩写法完全等价:

  • arr[0] 等价于 *(arr + 0),也就是直接解引用指针指向的第一个元素;
  • arr[1] 等价于 *(arr + 1),指针会自动向后偏移一个int类型的长度(指针类型决定了偏移的步长),再解引用得到第二个元素。

这也是为什么你的测试代码里两种写法输出完全一致的原因。

习惯用Python/JS的话,可能会觉得数组和指针是完全独立的概念,但C语言里数组和指针的绑定非常紧密,这种设计就是为了让你用统一的语法访问数组元素——不管是直接操作数组,还是操作退化成指针的数组参数,都不用改写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:52:14