引例

自定义函数里形参的类型,要和函数调用中传过去的实参类型相对应

test函数里的是int类型,我们传过去的参数a也是int类型

void test(int n){

}
int main(){
int a=1 test(a);
return 0;
}

好了,现在你已经知道了函数传参的基本概念了吧!那么就来分析一下数组传参、指针传参的代码吧!

一维数组传参

判断下面正误!


include <stdio.h>
//NO.1√
void test(int arr[]){
}
//NO.2√
void test(int arr[10]){
}
//NO.3√
void test(int *arr){
}
//NO.4√
void test2(int *arr[20]){
}
//NO.5√
void test2(int **arr){
}

int main(){
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
return 0;
}

NO.1 √形参使用数组的形式来接收,正确

NO.2 同样是数组的形式,正确

需要注意的是,数组传参并不会开辟一个新的数组

所以函数[ ]里的数字是多少并不影响

NO.3 数组名是首元素的地址,用指针接收,正确

NO.4 arr2是一个指针数组,(int *arr[20])和原数组对应,正确

NO.5 数组名是首元素地址,arr2的首元素是一个int*类型

可以用二级指针来接收,正确!

数组/指针的传参问题(23)_指针传参

二维数组传参

了解完一维数组了,那就来看看二维数组

以下的函数传参,哪些是对的,哪些是错的呢?


void test(int arr[3][5])//一一对应,正确!√
{}
void test(int arr[][])//省略列,错误!
{}
void test(int arr[][5])//可以省略行,正确!√
{}
void test(int *arr)//二维数组的首元素是第一行
{}//第一行是int(*)[5]类型,错误!
void test(int* arr[5])//指针数组,错误!
{}
void test(int (*arr)[5])//数组指针,正确!√
{}
void test(int **arr)//arr不是一级指针的地址,错误!
{}

int main(){
int arr[3][5] = {0};
test(arr);
return 0;
}

根据二维数组传参的代码,复习以下知识点

(1)二维数组的首元素是第一行

(2)二维数组在定义的时候可以省略行,不能省略列

第一行的类型是int[5],应该放进 数组指针里!

一维指针传参


#include <stdio.h>
void print(int *p, int sz){//用int*来接受
int i = 0;
for(i=0; i<sz; i++){
printf("%d\n", *(p+i));
}
}
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);

print(p, sz);//一级指针p,传给函数
return 0;
}

二维指针传参

以下是二级指针传参的基本形式

pp是int**类型,而&p是指针变量的地址,要用二级指针来接收


#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;
}

再来看如下代码

&p、pp、arr这三个参数的类型都是二级指针

test函数里面要用char**来接收


void test(char** p){
}

int main(){
char ch = 'w';
char* p = &ch;
char** pp = &p;
char* arr[5];

test(&p);
test(pp);
test(arr);

return 0;
}

arr是指针数组的数组名,数组名是数组首元素的地址

数组的首元素是char*类型,所以要用二级指针来接收

----------------END----------------