【不在混淆的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\r\n",p);
    //数据存储
    for(int i=0;i<20;i++){
        p[i]=i;
    } 
    return p;
} 

void main(){
   //调用 
   int *p=str();
   //地址 
   printf("addr p:%d\r\n",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\r\n",c);
   
   //赋值函数指针,找最小值 
   pfun=min; //或者为&min
   c=pfun(10,20);
   printf("%d\r\n",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\r\n",c);
   //找最小值调用 
   c=all(10,20,min);
   printf("%d\r\n",c);
}

无返回值和无参数

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

执行结果


 

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

 

posted @ 2021-02-24 11:47  东小东  阅读(692)  评论(0编辑  收藏  举报