携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
数组参数、指针参数
在写代码的时候难免要把数组或者指针传给函数,那函数的参数该如何设计呢?
一维数组传参
#include <stdio.h>
void test(int arr[])//ok?
{} //int arr[] 接收就是以int * arr形式接收,因为*arr等价与 arr[]
void test(int arr[10])//ok?
{} //int arr[10] 同上在形参中都是一个整型指针,形参中的数组长度无意义
void test(int* arr)//ok?
{} //整型指针接收数组名就是首元素地址也就是整型指针
void test2(int* arr[20])//ok?
{} //int* arr[20]等价于 int* arr[]等价于 int**arr 即二级指针
//而实参就是一个指向整型指针的指针也就是二级指针
void test2(int** arr)//ok?
{} //二级指针接收
int main()
{
int arr[10] = { 0 };
int* arr2[20] = { 0 };
test(arr);
test2(arr2);
}
二维数组传参
void test(int arr[3][5])//ok?
{} //二维数组传参二维数组接收
void test(int arr[][])//ok?
{} //error 不知道二维数组中一维数组中元素个数
void test(int arr[][5])//ok?
{} //可以省略行不能省略列
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
//这样才方便运算。
void test(int *arr)//ok?
{} //error 二维数组的数组名就是首元素地址,即一维数组的地址,
// 也就是数组指针,应该用数组指针接收
void test(int* arr[5])//ok?
{} //error,指针数组,实参是数组指针
void test(int (*arr)[5])//ok?
{} //实参为数组指针与形参类型相同
void test(int **arr)//ok?
{} //error
int main()
{
int arr[3][5] = {0};
test(arr);
}
我们来总结一下!
- 二维数组的数组名就是首元素地址,而二维数组的元素就是一维数组,所以数组名的类型就是数组指针。
- 当二维数组数组名传参,形参接收时,数组的行可以省略,列不能省略,如果省略了列,我们就无法知道当指针加减跳过几个字节。