函数指针和回调函数

1函数指针
声明一个max函数
int max(int a,int b);
函数的定义
int (*p)(int ,int );//函数指针的定义 构成:返回值类型 函数指针的名字 (参数的类型)
2回调函数
int getValue(int a,int b,int (*p)(int , int));//回调函数声明(函数参数里面有一个函数指针)
int getValue(int a,int b,int (*p)(int ,int )){//回调函数的定义 使用函数指针做参数 你可以不管函数的具体代码 使用指针直接调用即可
return p(a,b);}//如果说p指向的是一个核心的一个代码函数 如果这么使用 回调函数可以起到保护代码的作用 类似于OC中封装的特性
3动态排序
//练习 使用函数指针 给学生数组s1:"aaa",17,80 s2:"bbb",18,70 s3:"ccc",22,60 s4:"ddd",15,90 分别将其年龄,成绩,姓名排序,输出
typedef struct student{
    char name[20];
    int age;
    float score;
}student;
BOOL cmpByAge(student *s1,student *s2);//函数的声明
BOOL cmpByAge(student *s1,student *s2){//函数的定义
    return s1->age > s2->age;
}
BOOL cmpByScore(student *s1,student *s2);
BOOL cmpByScore(student *s1,student *s2){
    return s1->score > s2->score;
}
BOOL cmpByName(student *s1,student *s2);
BOOL cmpByName(student *s1,student *s2){
    return strcmp(s1->name, s2->name) > 0;
}
void sortArr(student stuArr[],int n , BOOL (*p)(student *,student *));
void sortArr(student stuArr[],int n , BOOL (*p)(student *,student *)){
    for (int i = 0; i < n - 1; i++) {
        for (int j= 0; j < n - 1 - i; j++) {
            if (p(&stuArr[j],&stuArr[j+1])) {//利用函数指针进行比较
                student temp = stuArr[j];
                stuArr[j] = stuArr[j+1];
                stuArr[j+1] = temp;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%s %d %.2f\n",stuArr[i].name,stuArr[i].age,stuArr[i].score);
    }
}
int main(int argc, const char * argv[]) {
    student stuArr[4] = {{"aaa",17,80},{"bbb",18,70},{"ccc",22,60},{"ddd",15,90}};                
    BOOL (*p1)(student *,student *) = NULL;
    p1 = cmpByAge;
    BOOL (*p2)(student *,student *) = NULL;
    p2 = cmpByScore;
    BOOL (*p3)(student *,student *) = NULL;
    p3 = cmpByName;
    sortArr(stuArr, 4, p1);
    printf("..........\n");
    sortArr(stuArr, 4, p2);
    printf("..........\n");
    sortArr(stuArr, 4, p3);
    printf("..........\n");
4函数返回值是函数指针
//typedef 给函数指针作为返回值的函数起新名字的两种形式
//1
//typedef int (*p1) (int ,int );
//p1 func1(char name[20]);
//2
//typedef int p2(int ,int );
//p2 *func2(char name[20]);
//Block
1
//float (*p1)(float , float);
//double (*p2)(double , double);
void (*p3)(stu *,stu *);
//int max(int a,int b){
//    return a > b ? a : b;
//}
//int sum(int a,int b);
//int sum(int a,int b){
//    return a+b;
//}
//float Sum(float a,float b);
//double Swap(double a, double b);
void name(stu *s1,stu *s2);
//void (*p4)();//1111111
//void printHello();
//void printHello(){
//    printf("hello");
//}
//void printHi(){
//    printf("hi");
//}
//int (*p)(int , int );
//int max(int a,int b);
//int max(int a,int b){
//    return a > b ? a : b;
//}
//int sum(int a,int b);
//int sum(int a,int b){
//    return a + b;
//}
2
//typedef struct student{
//    char name[20];
//    int score;
//}student;
//void addName(student *s);//void addName(student *s,int count);
//void addName(student *s){
//    char y[20] = "抢头条王";
//    strcat(s->name, y);
//}
//void AddName(student *s);
//void AddName(student *s){
//    char x[20] = "高富帅";
//    strcat((*s).name, x);
//}
//void findStu(student *arr,int count ,void (*ps)());
//void findStu(student *arr,int count ,void (*ps)()){
//    for (int i = 0; i < count; i++) {
//        if (arr[i].score >= 90) {
//            ps = AddName;
//            ps(arr[i].name);
//        }
//        else if (arr[i].score <= 60){
//            ps = addName;
//            ps(arr[i].name);
//        }
//    }
//    for (int i = 0; i < count; i++) {
//        printf("%s %d\n",arr[i].name,arr[i].score);
//    }
//}
//void (*p)() = NULL;
typedef struct student{
    char name[20];
    int score;
}student;
void addName(student *s);
void addName(student *s){
    strcat(s->name, "高富帅");
}
void findStu(student stuArr[],int n,void (*p)(student *));
void findStu(student stuArr[],int n,void (*p)(student *)){
    for (int i = 0; i  < n; i++) {
        if (stuArr[i].score >= 90) {
            p(&stuArr[i]);
        }
    }
}
int main(int argc, const char * argv[]) {
    student stuArr[4] = {{"周杰伦",98},{"庾澄庆",80},{"那英",70},{"汪峰",30}};
    void (*p)(student *) = NULL;
    p = addName;
    findStu(stuArr, 4, p);
    for (int i = 0; i  < 4; i++) {
        printf("%s %d\n",stuArr[i].name,stuArr[i].score);
    }
   // student arr[4] = {{"周杰伦",98},{"庾澄庆",70},{"那英",80},{"汪峰",30}};
//    student *parr = arr;
// //   p = addName;
//    findStu(parr, 4, p);
//    for (int i = 0; i < 4; i++) {
//        printf("%s %d\n",parr[i].name,parr[i].score);
//    }
//    int (*p)(int ,int ) = NULL;
//    p = sum;
//    printf("%d\n",getValue(3,5,p));//虽然说回调函数的形式相对比较复杂,但起到了很好的代码保护作用 或留出了代码接口
    //void (*p4)() = NULL;//222222*//初始化一个指针函数
//    printf("%d\n",max(5, 6));
//    p = max;//main函数外定义了一个函数指针
//    //函数名就是地址 咱们把函数名赋值给定义好的函数指针
//    p(3,5);//函数指针 其实它是为同一类函数使用而定义的
//    p4 = printHello;
//    p4();
//    p = sum;
//    printf("请输入函数名:");
//    char temp[20] = {0};
//    scanf("%s",temp);
//    int (*p)(int,int) = NULL;
//    if (strcmp(temp, "max") == 0) {
//        p = max;
//        printf("%d\n",p(3,5));
//    }
//    else if (strcmp(temp, "sum") == 0) {
//        p = sum;
//        printf("%d\n",p(3,5));
//    }
//    else
//        printf("error!");

转载于:https://www.cnblogs.com/sharkHZ/p/4984214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值