• 16.0、C语言——指针详解(2)


    16.0、C语言——指针详解(2)

    在设计 函数参数 时如何 传递指针类型 的参数?

    1. void test(int arr[]){}
    2. void test(int arr[6]){}
    3. void test(int* arr){}
    4. void test2(int* arr2[6]){}
    5. void test2(int** arr2){}
    6. int main() {
    7. int arr[6] = { 0 };
    8. int arr2[6] = { 0 };
    9. test(arr);
    10. test2(arr2);
    11. return 0;
    12. }

            当传递的参数是指针数组的首地址的时候,注意这里形参是一个二级指针,
    这里先回顾一下之前讲到 的指针定义的含义;

            int* pa = &a;   // int 是该指针指向变量的类型是 int 类型,' * ' 代表 pa 是一个指针变量,p 是指针变量名

            int** ppa = &pa;   // int*:该指针指向的变量类型是 int* 类型,' * ' :代表 ppa 是一个指针类型的变量,ppa 是变量名称 【ppa是一个二级指针

    ......... 

            那么当一个指针数组作为参数传递给函数的时候,形参应该用二级指针 int** arr2 去接收,因为这里int*表示 arr2 指向的变量是一个 int* 类型的变量,第二个 ' * ' 表示这是一个指针变量,arr2 就是指针变量的名称

    二维数组 如何传递参数:

    一、中规中矩的写法:

    1. test(int arr[3][5]) {}
    2. int main(){
    3. int arr[3][5] = { 0 };
    4. test(arr);
    5. return 0;
    6. }

    二、省略行的写法:【这里记住只能省略行不能省略列,否则编译不通过】

    1. test(int arr[][5]) {}
    2. int main(){
    3. int arr[3][5] = { 0 };
    4. test(arr);
    5. return 0;
    6. }

    三、用指针形参接收:

    1. test(int (*arr)[5]) {}
    2. int main(){
    3. int arr[3][5] = { 0 };
    4. test(arr);
    5. return 0;
    6. }

    函数指针:

            我们知道数组名其实就是首元素地址;【只不过 &arr 表示整个数组的地址,而 arr 只是首元素地址】
            函数也类似 -> 函数名 就是 函数的地址,通过验证可以发现 &函数名 == 函数名;

            那么定义一个函数指针的方式也跟数组指针很相似 ->  int ( *padd ) ( int , int ) = add;代码如下所示 ->

    1. int add(int a,int b) {
    2. return a + b;
    3. }
    4. int main() {
    5. int(*padd)(int, int) = add; //将add()函数的地址赋值给 padd 函数指针
    6. int ret = (*padd)(5, 5); //*padd相当于函数名,然后传参调用该add()函数
    7. printf("ret = %d",ret); //打印出来的结果的确是 10
    8. return 0;
    9. }

    在定义的语句中 :int ( *padd ) ( int ,  int ) = add;

            1、第一个 int 表示 add() 函数返回的类型是 int 类型【如果返回值类型是 char 这里就写char,如果是 void 就写 void】
            2、' * ' 表示该变量是一个指针变量【这里由于' * ' 的优先级比后面 ( ) 要低,所以定义的时候要用()括起来,不然变量名会先与后面的 ( ) 相结合变成一个函数】
            3、padd 是指针变量名
            4、后面两个 int 表示 add() 函数的形参类型        

     

  • 相关阅读:
    Selenium基础 —unittest单元测试框架
    [车联网安全自学篇] ATTACK安全之Frida反调试检测
    Day57 Linux 条件变量 信息量
    算法通关村第十六关:黄金挑战:滑动窗口与堆结合
    Global AI Bootcamp 成都站 圆满结束!
    暑假卷的最厉害的居然人工智能,人工智能该如何学习?详细的AI【学习路线】与【资料推荐】
    get/post请求使用工具(apifox/postman/浏览器)能请求通但是java代码不行的问题解决
    基于springboot的智慧养老平台
    Debian安装redis
    shell反弹
  • 原文地址:https://blog.csdn.net/m0_52433668/article/details/126556806