/*
Main program ---calls--> Library function ---calls--> Callback funtion
*/
#include <stdio.h>
#include <stdlib.h> typedef double (*op_fun)(double, double);/*函数指针的第一种定义方式,比较奇怪为什么不是 double () (double, double) * op_fun; 这种形式。*/ typedef struct _OP
{
double (*add)(double, double); /*函数指针第二种定义方式*/
double (*sub)(double, double);
double (*mul)(double, double);
//double (*div)(double, double);
op_fun div;
} OP; double add(double a, double b)
{
return a + b;
} double sub(double a, double b)
{
return a - b;
} double mul(double a, double b)
{
return a * b;
} double div(double a, double b)
{
return a / b;
} void OP_init(OP * op)
{
op->add = add;
op->sub = sub; /*函数指针第一种赋值方式*/
op->mul = &mul; /*函数指针第二种赋值方式*/
op->div = &div;
} /*Library function*/
double lib_fun(double a, double b, double (*op)(double, double))
{
return op(a, b);
//return (*op)(a, b);
} //double (*op_arr[5])(double, double); /*声明函数指针数组的第一种方式*/
op_fun op_arr[]; /*声明函数指针数组的第二种方式*/ void op_arr_init() {
op_arr[] = add;
op_arr[] = sub;
op_arr[] = &mul;
op_arr[] = &div;
} double (* get_op(int num))(double, double) /*函数指针作为返回值,get_op参数为(int num),返回类型为double(*)(double, double)*/
{
op_arr_init();
if ( <= num && num <= ) return op_arr[num];
return NULL;
} int main(int argc, char const *argv[])
{
OP * op = (OP *)malloc(sizeof(OP));
OP_init(op);
double a, b;
scanf("%lf %lf", &a, &b);
printf("ADD = %lf, SUB = %lf, MUL = %lf, DIV = %lf\n", (op->add)(a, b), (op->sub)(a, b), /*函数指针第一种调用方式*/
(*op->mul)(a, b), (*op->div)(a, b)); /*函数指针第二种调用方式*/
printf("ADD = %lf, SUB = %lf, MUL = %lf, DIV = %lf\n", lib_fun(a, b, add), lib_fun(a, b, sub), lib_fun(a, b, mul), lib_fun(a, b, div));
free(op); int num;
printf("Input operation(1:add, 2:sub, 3:mul, 4:div):\n");
scanf("%d", &num);
if (num) printf("Answer is %lf\n", lib_fun(a, b, get_op(num)));
else printf("Wrong!\n");
return ;
}

C语言回调函数总结的更多相关文章

  1. C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  2. 转·带你用实例理解C语言回调函数

    原文出处:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 前言: 如不懂函数指针,请先查阅关于函数指针内容的资料(h ...

  3. 【转】一文搞懂C语言回调函数

    转:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 什么是回调函数 我们先来看看百度百科是如何定义回调函数的: 回调 ...

  4. 对c语言回调函数的理解

    对于回调函数,可以简单的理解为一种特别的函数调用方法,我们可以对比一下回调函数与普通函数在调用方法上的区别. 1. 普通函数调用 一般为实现方在其函数体执行过程中直接调用. 代码示例: #includ ...

  5. C语言回调函数

    Callbacks have a wide variety of uses. For example, imagine a function that reads a configuration fi ...

  6. C语言中的回调函数(Callback Function)

    1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...

  7. C语言的本质(17)——回调函数

    如果函数的参数是一个函数指针,我们可以通过这个函数指针传递一个函数的地址给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数(Callback Function).回调函数不是由 ...

  8. C语言中的回调函数

    C语言中通过函数指针实现回调函数(Callback Function) ====== 首先使用typedef定义回调函数类型 ======  typedef void (*event_cb_t)(co ...

  9. C语言学习及应用笔记之七:C语言中的回调函数及使用方式

    我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题.但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析. 1.什么是回调函数 ...

随机推荐

  1. lock 默认公平锁还是非公平锁?公平锁是如何定义?如何实现

    ReentrantLock的实现是基于其内部类FairSync(公平锁)和NonFairSync(非公平锁)实现的. 其可重入性是基于Thread.currentThread()实现的: 如果当前线程 ...

  2. ZooKeeper系列文章

    ZooKeeper FAQ ZooKeeper客户端事件串行化处理 ZooKeeper分布式锁避免羊群效应(Herd Effect) ZooKeeper管理员指南——部署与管理ZooKeeper Zo ...

  3. Css实现拖动效果

    效果如下,可以拖动滑块,数字显示的是离左侧距离:

  4. 【ABP】Abp的AspNetZero5.0版本无法使用ctrl+f5调式

    原文:http://www.cnblogs.com/94pm/p/7942483.html AspNetZero是基于Abp框架开发的商业程序,最近从Abp交流群中得知5.0版本开始加入了防盗版的功能 ...

  5. SPOJ3899——Finding Fractions

    SPOJ上的每个题目都做得我泪牛满面. 这个题目也是的.题目意思是给你两个分数a/b和c/d,要你求出一个分数p/q,使得a/b<p/q<c/d,且p最小. 看完题目后半天都没有任何思路哦 ...

  6. 【bzoj1067】[SCOI2007]降雨量 倍增RMQ

    题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和200 ...

  7. 【BZOJ3714】Kuglarz(最小生成树)

    [BZOJ3714]Kuglarz(最小生成树) 题面 BZOJ Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯 ...

  8. bzoj2006: [NOI2010]超级钢琴(堆+RMQ)

    和上一道题同类型...都是用堆求第k大 考虑对于每一个r,怎么求出一个最优的l.显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了.但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把 ...

  9. [知识点]C++中STL容器之vector

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...

  10. 【bzoj3796】Mushroom追妹纸

    Portal -->bzoj3796 Description 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. ​ 求w的 ...