4. 数组参数、指针参数
我们来看一维数组传参
#include<stdio.h> void test(int arr[])//ok? {} void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])//ok? {} void test2(int** arr)//ok? {} int main() { int arr[10] = { 0 }; int* arr2[20] = { 0 }; test(arr); test2(arr2); }
我们来分析一下上面5个传参的方式,首先看第一个,数组名传参可以用一个数组接受,数组的大侠可以省略也可以补省略,数组名就是首元素的地址,也可以用一个指针来接收,对于指针数组来说,数组名传参也可以用一个数组接收,并且数组的每个元素的类型为int*
对于最后一种,数组名是首元素的地址,指针数组的第一个元素的地址是一个一级指针,需要用一个二级指针来接收
我们接着来看二维数组传参
#include<stdio.h> void test(int arr[3][5])//ok? {} void test(int arr[][])//ok? {} void test(int arr[][5])//ok? {} //总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。 //因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。 //这样才方便运算。 void test(int* arr)//ok? {} void test(int* arr[5])//ok? {} void test(int(*arr)[5])//ok? {} void test(int** arr)//ok? {} int main() { int arr[3][5] = { 0 }; test(arr); }
我们还是来分析一下代码。二维数组的数组名是首元素的地址(第一行的地址,把二维数组想象成一个一维数组即可)二维数组数组名传参可以拿一个二维数组来接收,但是二维数组数组名传参可已拿一个省略了行的二维数组接收,但是不能拿一个省略了列的二维数组接收,也不能拿一个既省略了行又省略了列的二维数组来接收,二维数组名传参传过来的是首元素的地址第一种方式用于接收一维数组首元素的地址,所以排除,第二种方式是用于接收一级指针变量的地址,第三种方式是用于用于接收二维数组首元素的地址,,把第一行的地址传过去用一个指针接收,这个数组里面有5个元素,这种方式可行,希望大家能够理解
思考:
当一个函数的参数部分为一级指针的时候,函数能接收什么参数?
void test1(int* p) {} //test1函数能接收什么参数? void test2(char* p) {} //test2函数能接收什么参数?
大家可以把答案打在评论区,我会在评论区公布答案
那么对于二级指针传参呢?我们看代码
#include <stdio.h> void test(int** ptr) { printf("num = %d\n", **ptr); } int main() { int n = 10; int* p = &n; int** pp = &p; test(pp); test(&p); return 0; }
二级指针传参就直接拿一个二级指针接收,对于一级指针传值,在这里需用一个二级指针接收用于存放一级指针的地址(因为我们这里讲的是用二级指针接收)
思考:
当函数的参数为二级指针的时候,可以接收什么参数?
大家先思考,我把答案放在评论区供大家参考
本章终!