1.一维数组传参: 形参可以是数组也可以是指针!
#include <stdio.h> int main() { void test1(int arr[]) { } void test2(int arr[10]) { } }
对于上述代码中,传递的形参为数组!对于test1, test2 中的数组大小可以省略!数组传参时,不会传递整个数组!因此对于数组的大小,在形参里面随便写,这个值是不会使用的!(但是建议不要随便写!万一……得不偿失!)
#include <stdio.h> int main() { void test3(int* arr) //形参为指针 { } void test4(int* arr[20]) //形参为数组 { } //arr[20],中的20可以省略! void test5(int** arr) //形参为指针 { } }
对于上述代码段形参,显得残次不齐!请读者仔细思考一下!
int arr[10] = { 0 }; test(arr); int* arr2[20] = { 0 }; test(arr2);
对于上述代码,笔者所讲述了,如何将数组当作指针来进行传参(数组传参时候,本质上传递的是地址)!!
对于: int* arr2[20] = { 0 }; 部分,arr 2是用来存放指针数组的(一维数组,存放整型指针的数组)
对于arr2[20]的类型解析:
显而易见的对于arr2[20]:存放了20个int * 类型的整型指针!!
2:二维数组传参的书写规范指正!
对于二维数组大多刚刚对于指针入门的读者而言,二维数组传参时候的书写规范,目前并没有系统的了解!所以笔者下面来带领大家走进对二维数组的传参书写规范!加深了解与认识!
对于二维数组传参时候,形参可以是数组,也可以是指针!!
对于形参是数组部分:
void test1(int arr[3][5]) //正确 { } void test2(int arr[][]) //错误写法 { } void test3(int arr[][5]) //正确 { }
上述代码中,test1与test3都是正确的写法!对于数组的行与列部分:行可以省略,列不能省略!对于test2是个严重错误的典范,严重不可取!!需要注意的是:test3里面的arr[][5],列的5需要与实参的数值相对应!!
对于形参是数组部分:
void test4(int* arr) //错误写法 { } void test5(int* arr[5]) //错误写法 { } void test6(int(*arr)[5]) //正确 { } void test7(int** arr) //错误写法 { }
对于上述代码中,只有test6是正确的写法,其他都是错误的写法!
对于:void test7(int** arr) 书写的是二级指针,但需要强调的是二级指针是用来接收一级指针变量的地址!而不是二维数组!
#include <stdio.h> int main() { int arr[3][5] = { 0 }; tets(arr); //数组名是数组首元素的地址!——》二维数组第一行的地址! //实参传递的是二维数组的数组名,因此需要用上面讲解的书写规范来使用…… }
3.一级指针传参!
对于一级指针传参,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!
#include <stdio.h> void print(int* p, int sz) //一级指针传参,一级指针接收! { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } printf("\n"); } int main() { 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); //一级指针p,作为实参传递给形参! return 0; }
代码的运行结果为:
思考一下:
当一个函数的参数部分为一级指针的时候,函数能接收什么参数???
void test(int* p) //一级指针接收 { } int main() { int a = 0; test(&a); //方法1 int a = 0; int* ptr = &a; test(ptr); //方法2 int arr[10] = { 0 }; test(arr); //方法3 }
因此有着上述三种方法来实现:一个函数部分为一级指针的时候,实参的传递方法!
4.二级指针传参
对于二级指针传参,跟一级指针一样,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!
#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; }
代码的运行结果为:
下面疑问接着而来!
当一个函数的参数部分为二级指针的时候,函数能接收什么参数???
参考思考部分:
void test(int** p) { } int main() { int** ptr; test(ptr); //方法1 int* p2; test(&p2); //方法2 int* arr[10]; test(arr); //方法3 }
笔者目前所知道的有着上述三种方法来实现:一个函数部分为二级指针的时候,实参的传递方法!
此篇博客到此就已经结束,耗时接近三小时打磨而来,请读者……一键三连呀!!!