【C语言干货】一维数组传参本质
文章目录
- 前言
- 一、数组传参的本质
- 1.数组名的退化
- 2.两种等价的函数声明
- 总结
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、数组传参的本质
1. 数组名的退化
在C语言中,当数组作为函数参数传递时,数组名会"退化"(decay)为指向其首元素的指针。这意味着:
-
无论函数原型中如何声明参数(
int arr[]
或int *arr
),编译器都会将其视为指针 -
函数内部接收到的实际上是一个指针变量,而不是整个数组
-
因此,sizeof操作符返回的是指针的大小,而不是数组的大小
2.两种等价的函数声明
以下两种函数声明在编译器看来是完全等价的:
c复制下载void func(int arr[]); // 看似接收数组
无论采用哪种形式,函数内部得到的都是一个指针变量。第一种写法更多是为了代码的可读性,暗示这个指针应该指向一个数组。
总结
C语言这样设计有几个重要原因:
-
效率考虑:如果每次传递数组都要拷贝整个数组,对于大数组会非常低效
-
历史原因:C语言设计之初就注重效率和接近硬件的特性
-
灵活性:可以传递数组的一部分(如
arr+5
传递第6个元素开始的子数组)