在写代码的时候难免要把【数组】或者【指针】传递给函数,那函数的参数该如何设计呢?
-
一维数组传参
int arr[10] = {0}; int *arr2[20] = {0}; test(arr); test2(arr2); //下面哪些函数参数设计比较合适? void test(int arr[]); // ok void test(int arr[10]); // ok 写不写这个10都没意义,因为并不会开辟数组空间,只是传递地址,告诉该如何接收参数而已 void test(int *arr); // ok 本身传递是首元素地址 void test2(int *arr[20]); // ok 20也可以省略 void test2(int **arr); // ok 由于传递的是个指针数组,数组的每个元素都是一级指针(int*),首元素地址就是一级指针的地址,就是二级指针
-
二维数组传参
int arr[3][5] = {0}; test(arr); // 二维数组传参,传递的是一维数组的首地址 void test(int arr[3][5]); // ok void test(int arr[][5]); // ok void test(int arr[3][]); // error!! 列不可省略 void test(int arr[][]); // error!! void test(int *arr); // error!!二维数组的首元素是一维数组,首元素地址是一维数组的地址,应该存放在一维数组类型的指针中,而不是int* void test(int **arr); // error! 和上面一样,第一行的地址,应该是数组的地址;二级指针是用来存放一级指针变量的地址的,而不是存放数组的地址;存放数组的指针应该是数组指针!!!int (*arr)[5] void test(int (*arr)[5]); // ok void test(int* arr[5]); // error!!
其实这里要注意的就是二维数组传参时,不能直接使用**
,原因如上
一级指针传参
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
print(p, sz);
void print(int *p, int sz);
一级传参很简单,但是当一个函数的参数是一级指针时,函数能接收什么参数?
void test(int *p);
int a = 10; int arr[] = {1,2,3}; int *p = &a; test(&a); // ok test(p); // ok test(arr); // ok test(arr[0]); // ok
二级指针传参
int n = 10;
int *p = &n;
int **pp = &p;
int* arr[10];
test(pp);
test(&p);
test(arr);// arr是一维(int *)数组的地址,也就是说可以是一级指针