C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ;
将
int array[10]
数组 , 作为参数 , 传递到函数中 ,
void fun(int array[1000]){}
与
void fun(int *array){}
是等价的 , 函数中处理 array
数组时 , 不知道该数组的元素个数 , 编译器只能确认 , 该参数是一个 int *
指针类型 ;
这样操作是为了提高 编译器 的效率 , 提高程序执行的效率 , 函数的 形参 最终要拷贝到 栈内存 中 ,
个元素 , 需要拷贝
字节 , 这样效率就很低了 ;
字节就可以了 ;
一维数组 形参 退化路径 :
int array[1000]
void fun(int array[1000])
{
}
int array[]
void fun(int array[])
{
}
int *array
void fun(int *array)
{
}
二维数组 作为 函数形参 , 也会退化为指针 ;
将 二维数组 看作 一维数组 ,
一维数组 退化时 , 退化为 指向 一维数组元素 的 指针 ;
二维数组 退化时 , 退化为 指向 二维数组元素 的 指针 , 这个 二维数组元素 就是 一维数组 , 也就是退化为 指向 一维数组的指针 ;
特别注意 , 二维数组 退化的 指针 , 指向的 一维数组 是有效的 , 可以得到数组的元素个数 , 是一个正式的数组 ;
二维数组 形参 退化路径 :
int array[10][20]
void fun(int array[10][20])
{
}
int array[][20]
void fun(int array[][20])
{
}
int (*array)[20]
: 此处注意 , 数组指针 指向的 一维数组 是完整的数组 ;void fun(int (*array)[20])
{
}
实参为 一维数组 int array[10]
, 等效的 形参为 一级指针 int *array
;
实参为 指针数组 int *array[10]
, 等效的 形参为 一级指针 int **array
;
实参为 二维数组 int array[10][20]
, 等效的 形参为 一级指针 int (*array)[20]
;
个元素 ;