////////——实参与形参的关系

////数组是连续存放的,只要知道数组的首地址和数组的长度就能找到这个数组中所有的元素。

////因此,要想通过实参和形参将一个数组从主调函数传到被调函数,那么只需要传递这两个信息即可。

////对于一维数组来说,其数组名就表示一维数组的首地址。  

////所以只需要传递数组名和数组长度这两个参数就可以将数组从主调函数传入被调函数中。  

////当数组名作为函数的实参时,形参列表中也应定义相应的数组(或用指针变量),

////且定义数组的类型必须与实参数组的类型一致,如果不一致就会出错。

////——————数组参数、指针参数

//数组传参时,可以传数组也可以传指针

//#include <stdio.h>

//void test(int arr[])//方法1:ok//"[]"内可以标记数组元素个数,也可以省略

//{}

////void test(int arr[10])//方法2:ok

////{}

//////void test(int* arr)//方法3:ok

//////{}

//void test2(int* arr[])//方法1:ok

//{}

////void test2(int* arr[20])//方法2:ok

////{}

//////void test2(int** arr)//方法3:ok//二级指针是指向一级指针的指针

//////{}                             //二级指针是存放一级指针的地址

//int main()

//{

// int arr[10] = { 0 };

// int* arr2[20] = { 0 };

// test(arr);

// test2(arr2);

//}

//////————————二维数组传参(三维数组直能省略第一维)

// 1.传数组

//void test(int arr[3][5])//ok

//{}

////void test(int arr[][])//no//形参的二维数组,行可以省略,列不可以省略(先行后列)

////{}

//////void test(int arr[][5])//ok

//////{}

//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。

//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。

////2.传指针

//void test(int* arr)//no //一维数组的地址不能放在一级指针中,只能放在二级指针中。

//{}

//void test(int* arr[5])//no//此处为指针数组,不是指针

//{}

////void test(int(*arr)[5])//ok//此处为数组指针

////{}

//////void test(int** arr)//ok//一维数组的地址放在二级指针中

//////{}

//int main()

//{

// int arr[3][5] = { 0 };

// test(arr);//二维数组的数组名,表示第一行的地址(第一行是有5个整型元素的一维数组)

//}

////关键在于实参是谁,传的是什么,再去考虑形参与之匹配即可

//////————————一级指针传参

////指针传参,传指针,就用指针接收

//#include <stdio.h>

//void print(int* p, int sz)

//{

// 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]);

// //一级指针p,传给函数

// print(p, sz);

// return 0;

//}

////——————思考题?

//// 当一个函数的参数部分为一级指针的时候,函数能接收什么参数?

////答:实参可以为1.整型变量的地址2.整型指针3.整型数组的数组名4.*二级指针

////(只要我们传过去的值的本质是整型指针,。就可以传参)

////思考题举例

//#include<stdio.h>

//void print(int* p)

//{

//

//}

//int main()

//{

// int a = 10;

// int* ptr = &a;

// int arr[10];

// //实参可为:

// print(&a);

// print(ptr);

// print(arr);

// return 0;

//}

//////————————二级指针传参

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

//}

//////————思考题?

////当函数的参数为二级指针的时候,可以接收什么参数?

////答:实参可以为1.二级指针2.一级指针的地址3.指针数组4.*三级指针

//void test(char** p)

//{

//

//}

//int main()

//{

// char c = 'b';

// char* pc = &c;

// char** ppc = &pc;

// char* arr[10];

// test(&pc);//ok

// test(ppc);//ok

// test(arr);//ok

// return 0;

//}