• 4步讲解一维数组传参与二维数组传参


    当你搜到笔者此篇博客,或者在偶然间看见笔者此篇博客时候,你或许已经成功学会了数组及初步了解了指针,当你怀着好奇心来跟着笔者的博客走起来的时候,就会发现,哦!原来:数组传参,指针传参竟然还能这样用!!

    下面请跟着笔者来欣赏一下:此篇博客对于数组传参与指针传参的理解!请紧跟笔者思路哟!拨乱反正!回归大梁!!

    讲解的主要内容:

    1.一维数组传参:  形参可以是数组也可以是指针!

    2:二维数组传参的书写规范指正!

    3.一级指针传参!

    4.二级指针传参

    下面笔者仍用代码+解析的方式来带领读者走进此篇博客!!!

    1.一维数组传参:  形参可以是数组也可以是指针!

    1. #include
    2. int main()
    3. {
    4. void test1(int arr[])
    5. { }
    6. void test2(int arr[10])
    7. { }
    8. }

    对于上述代码中,传递的形参为数组!对于test1, test2 中的数组大小可以省略!数组传参时,不会传递整个数组!因此对于数组的大小,在形参里面随便写,这个值是不会使用的!(但是建议不要随便写!万一……得不偿失!)

    1. #include <stdio.h>
    2. int main()
    3. {
    4. void test3(int* arr) //形参为指针
    5. { }
    6. void test4(int* arr[20]) //形参为数组
    7. { } //arr[20],中的20可以省略!
    8. void test5(int** arr) //形参为指针
    9. { }
    10. }

    对于上述代码段形参,显得残次不齐!请读者仔细思考一下!

    1. int arr[10] = { 0 };
    2. test(arr);
    3. int* arr2[20] = { 0 };
    4. test(arr2);

    对于上述代码,笔者所讲述了,如何将数组当作指针来进行传参(数组传参时候,本质上传递的是地址)!!

    对于: int* arr2[20] = { 0 }; 部分,arr 2是用来存放指针数组的(一维数组,存放整型指针的数组)

    对于arr2[20]的类型解析:

     显而易见的对于arr2[20]:存放了20个int *  类型的整型指针!!

    2:二维数组传参的书写规范指正!

    对于二维数组大多刚刚对于指针入门的读者而言,二维数组传参时候的书写规范,目前并没有系统的了解!所以笔者下面来带领大家走进对二维数组的传参书写规范!加深了解与认识!

    对于二维数组传参时候,形参可以是数组,也可以是指针!!

    对于形参是数组部分:

    1. void test1(int arr[3][5]) //正确
    2. { }
    3. void test2(int arr[][]) //错误写法
    4. { }
    5. void test3(int arr[][5]) //正确
    6. { }

    上述代码中,test1与test3都是正确的写法!对于数组的行与列部分:行可以省略,列不能省略!对于test2是个严重错误的典范,严重不可取!!需要注意的是:test3里面的arr[][5],列的5需要与实参的数值相对应!!

    对于形参是数组部分:

    1. void test4(int* arr) //错误写法
    2. { }
    3. void test5(int* arr[5]) //错误写法
    4. { }
    5. void test6(int(*arr)[5]) //正确
    6. { }
    7. void test7(int** arr) //错误写法
    8. { }

    对于上述代码中,只有test6是正确的写法,其他都是错误的写法!

    对于:void test7(int** arr)   书写的是二级指针,但需要强调的是二级指针是用来接收一级指针变量的地址!而不是二维数组!

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr[3][5] = { 0 };
    5. tets(arr); //数组名是数组首元素的地址!——》二维数组第一行的地址!
    6. //实参传递的是二维数组的数组名,因此需要用上面讲解的书写规范来使用……
    7. }

    3.一级指针传参!

    对于一级指针传参,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!

    1. #include <stdio.h>
    2. void print(int* p, int sz) //一级指针传参,一级指针接收!
    3. {
    4. int i = 0;
    5. for (i = 0; i < sz; i++)
    6. {
    7. printf("%d ", *(p + i));
    8. }
    9. printf("\n");
    10. }
    11. int main()
    12. {
    13. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    14. int* p = arr;
    15. int sz = sizeof(arr) / sizeof(arr[0]);
    16. print(p, sz);
    17. //一级指针p,作为实参传递给形参!
    18. return 0;
    19. }

    代码的运行结果为:

    思考一下:

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

    1. void test(int* p) //一级指针接收
    2. { }
    3. int main()
    4. {
    5. int a = 0;
    6. test(&a); //方法1
    7. int a = 0;
    8. int* ptr = &a;
    9. test(ptr); //方法2
    10. int arr[10] = { 0 };
    11. test(arr); //方法3
    12. }

    因此有着上述三种方法来实现:一个函数部分为一级指针的时候,实参的传递方法!

    4.二级指针传参

     对于二级指针传参,跟一级指针一样,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!

    1. #include <stdio.h>
    2. void test(int** ptr)
    3. {
    4. printf("num=%d \n", **ptr);
    5. }
    6. int main()
    7. {
    8. int n = 10;
    9. int* p = &n;
    10. int** pp = &p;
    11. test(pp);
    12. test(&p); //一级指针的地址
    13. return 0;
    14. }

    代码的运行结果为:

     下面疑问接着而来!

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

    参考思考部分:

    1. void test(int** p)
    2. { }
    3. int main()
    4. {
    5. int** ptr;
    6. test(ptr); //方法1
    7. int* p2;
    8. test(&p2); //方法2
    9. int* arr[10];
    10. test(arr); //方法3
    11. }

    笔者目前所知道的有着上述三种方法来实现:一个函数部分为二级指针的时候,实参的传递方法!

    此篇博客到此就已经结束,耗时接近三小时打磨而来,请读者……一键三连呀!!!

  • 相关阅读:
    MySQL常见面试题(四)
    11月业务安全月报 | 台湾2300万人信息泄露;黑客两分钟即可破解安卓锁屏;乌克兰“IT军团”入侵俄罗斯中央银行
    (二十四)数据结构-选择排序
    Flask像Jenkins一样构建自动化测试任务
    解决ElementUI导航栏重复点菜单报错问题
    虚拟机来安装Linux的优势
    R语言将向量数据按照行方式转化为矩阵数据(设置参数byrow为TRUE)
    IDEA-SVN合并分支到主干
    【JavaScript】基于querySelector / querySelectorAll对元素的操作,为你的DOM API基础扫盲~
    C++ 类的前置声明
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126771854