- void test(int arr[]){}
- void test(int arr[6]){}
- void test(int* arr){}
- void test2(int* arr2[6]){}
- void test2(int** arr2){}
-
- int main() {
- int arr[6] = { 0 };
- int arr2[6] = { 0 };
- test(arr);
- test2(arr2);
- return 0;
- }
当传递的参数是指针数组的首地址的时候,注意这里形参是一个二级指针,
这里先回顾一下之前讲到 的指针定义的含义;
int* pa = &a; // int 是该指针指向变量的类型是 int 类型,' * ' 代表 pa 是一个指针变量,p 是指针变量名
int** ppa = &pa; // int*:该指针指向的变量类型是 int* 类型,' * ' :代表 ppa 是一个指针类型的变量,ppa 是变量名称 【ppa是一个二级指针】
.........
那么当一个指针数组作为参数传递给函数的时候,形参应该用二级指针 int** arr2 去接收,因为这里int*表示 arr2 指向的变量是一个 int* 类型的变量,第二个 ' * ' 表示这是一个指针变量,arr2 就是指针变量的名称
一、中规中矩的写法:
- test(int arr[3][5]) {}
- int main(){
- int arr[3][5] = { 0 };
- test(arr);
- return 0;
- }
二、省略行的写法:【这里记住只能省略行不能省略列,否则编译不通过】
- test(int arr[][5]) {}
- int main(){
- int arr[3][5] = { 0 };
- test(arr);
- return 0;
- }
三、用指针形参接收:
- test(int (*arr)[5]) {}
- int main(){
- int arr[3][5] = { 0 };
- test(arr);
- return 0;
- }
我们知道数组名其实就是首元素地址;【只不过 &arr 表示整个数组的地址,而 arr 只是首元素地址】
函数也类似 -> 函数名 就是 函数的地址,通过验证可以发现 &函数名 == 函数名;
那么定义一个函数指针的方式也跟数组指针很相似 -> int ( *padd ) ( int , int ) = add;代码如下所示 ->
- int add(int a,int b) {
- return a + b;
- }
- int main() {
- int(*padd)(int, int) = add; //将add()函数的地址赋值给 padd 函数指针
- int ret = (*padd)(5, 5); //*padd相当于函数名,然后传参调用该add()函数
- printf("ret = %d",ret); //打印出来的结果的确是 10
- return 0;
- }
在定义的语句中 :int ( *padd ) ( int , int ) = add;
1、第一个 int 表示 add() 函数返回的类型是 int 类型【如果返回值类型是 char 这里就写char,如果是 void 就写 void】
2、' * ' 表示该变量是一个指针变量【这里由于' * ' 的优先级比后面 ( ) 要低,所以定义的时候要用()括起来,不然变量名会先与后面的 ( ) 相结合变成一个函数】
3、padd 是指针变量名
4、后面两个 int 表示 add() 函数的形参类型