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
相关产品推荐
相关产品推荐

