zoukankan      html  css  js  c++  java
  • 【不在混淆的C】指针函数、函数指针、回调函数

    一、指针函数

    函数的返回值是指针类型。

    int* fun(int a,int b);

    指针函数使用:

    返回字符串

    这里要注意,"1234567890abc"是字符串常量,*p指向的字符串地址,返回的是这个地址,因为字符串常量不会因为函数消亡而释放,所有主函数依然可以访问到地址的内容。

    #include <stdio.h>
    
    char* str(){
        char *p="1234567890abc";
        return p;
    } 
    
    void main(){
       printf("%s",str());
    }

    返回申请堆空间的内容

    #include <stdio.h>
    
    int* str(){
        //申请堆空间 
        int *p=malloc(20*sizeof(int));
        //打印地址 
        printf("addr p:%d
    ",p);
        //数据存储
        for(int i=0;i<20;i++){
            p[i]=i;
        } 
        return p;
    } 
    
    void main(){
       //调用 
       int *p=str();
       //地址 
       printf("addr p:%d
    ",p);
       //数据输出 
       for(int i=0;i<20;i++) { 
          printf("%d",p[i]);
       } 
       //释放堆空间 
       free(p); 
    }

    二、函数指针

    如int类型指针(int* p)一样,是一种指针类型

    定义了一个函数,那么编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

    定义形式:

    返回值类型 (*函数指针变量名)(形参1类型,形参2类型,…)

    如函数原型:

    int fun1(int a,int b);

    函数指针为:

    int (*funp)(int,int)

     

    如函数原型:

    void fun2();

    函数指针为:

    void (*fun2p)();

    使用时直接将函数名赋值给函数指针(指针变量名)即可,如:

    #include <stdio.h>
    //找最大值 
    int max(int a,int b){
        if(a>b) return a;
        return b;
    }
    //找最小值 
    int min(int a,int b){
        if(a<b) return a;
        return b;
    }
    
    void main(){
       //定义函数指针变量 pfun 
       int (*pfun)(int,int);
       
       //赋值函数指针,找最大值 
       pfun=max;//或者为&max
       int c=pfun(10,20);
       printf("%d
    ",c);
       
       //赋值函数指针,找最小值 
       pfun=min; //或者为&min
       c=pfun(10,20);
       printf("%d
    ",c);
    }

    输出:

    三、  回调函数

    回调函数其实就是使用函数指针作为函数的形参

    #include <stdio.h>
    //找最大值 
    int max(int a,int b){
        if(a>b) return a;
        return b;
    }
    //找最小值 
    int min(int a,int b){
        if(a<b) return a;
        return b;
    }
    //函数入口 
    int all(int a,int b,int (*pfun)(int,int)){
        return pfun(a,b);
    }
    void main(){
       int c=0;
       //找最大值调用 
       c=all(10,20,max);
       printf("%d
    ",c);
       //找最小值调用 
       c=all(10,20,min);
       printf("%d
    ",c);
    }

    无返回值和无参数

    #include <stdio.h>
    void pa(){
        printf("aaaaaaaaaaaa
    ");
    }
    void pb(){
        printf("bbbbbbbbbbbb
    ");
    }
    int pall(void (*pfun)()){
        pfun();
    }
    void main(){
       pall(pa);
       pall(pb);
    }

    执行结果


    本人视频号:https://space.bilibili.com/162091292

  • 相关阅读:
    day23_2_logging
    day23_1-re模块之转义字符、分组、方法
    The Python Standard Library
    re.groups取出来的空元祖??
    Mybatis-学习笔记(2)Mybatis配置文件
    Mybatis-第N篇配置log4j1、log4j2打印执行的sql语句
    Java-数据库连接池第一篇
    Mybatis-学习笔记(1)SqlSessionFactory、SqlSession、Mybatis配置文件configuration的属性标签
    Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器
    Java-多线程第四篇线程池
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/14440499.html
Copyright © 2011-2022 走看看