一、通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址)

    1、定义:通过函数指针将函数传入函数;通过函数返回函数指针实现函数返回函数的目标

    2、特征:

      1)、通过函数指针的介入,使函数调用变得更加灵活,实现功能的封装性

      2)、使真正的函数下沉一层,有利于函数功能的抽象

      3)、是函数的交互变得更加自然与方便

    3、函数指针:

      1)、定义:与普通函数的定义基本类似,包括函数类型、函数名称和函数参数;形如 int  (*guoCal)(int, int);

      2)、特征:唯一的区别就是在函数名称前加上*,并使用()将*和函数名称包括起来;

      3)、说明:上述定义的是返回类型为int ,函数参数为两个int类型的函数的指针;

      4)、应用:若存在上述定义,存在函数int add(int, int), int sub(int, int), 则可以有guoCal = add; guoCal = sub等语句

  代码如下:

        1)、通过函数指针使函数返回函数:

  #include <stdio.h>

  int add(int var1, int var2){
return var1 + var2;
} int sub(int var1, int var2){
return var1 - var2;
} int mul(int var1, int var2){
return var1 * var2;
} int div(int var1, int var2){
return var1 / var2;
} int mod(int var1, int var2){
return var1 % var2;
} void inputVar(int *var1, int *var2){
printf("Please input var1: ");
scanf("%d", var1); printf("Please input var2: ");
scanf("%d", var2); return;
} typedef int (*ptrCal)(int, int); ptrCal resultCal(char *ch){
ptrCal cal1;
printf("Please input ch: ");
scanf("%c", ch); switch(*ch){
case '+':
cal1 = add;
break; case '-':
cal1 = sub;
break; case '*':
cal1 = mul;
break; case '/':
cal1 = div;
break; case '%':
cal1 = mod;
break; default:
printf("you can select:+ - * / %!\n");
} return cal1;
} int main(int argc, char **argv)
{
ptrCal cal2;
int var1;
int var2;
char ch;
inputVar(&var1, &var2);
getchar();
cal2 = resultCal(&ch);
printf("The %d %c %d = %d\n", var1, ch, var2, cal2(var1, var2)); return ;
}

      2)、通过将函数指针作为函数的参数:

  #include <stdio.h>

  int add(int var1, int var2){
return var1 + var2;
} int sub(int var1, int var2){
return var1 - var2;
} int mul(int var1, int var2){
return var1 * var2;
} int div(int var1, int var2){
return var1 / var2;
} int mod(int var1, int var2){
return var1 % var2;
} void inputVar(int *var1, int *var2){
printf("Please input var1: ");
scanf("%d", var1); printf("Please input var2: ");
scanf("%d", var2); return;
} typedef int (*ptrCal)(int, int); int resultCal(ptrCal cal, int var1, int var2){
return cal(var1, var2);
} int main(int argc, char **argv)
{
int var1;
int var2;
inputVar(&var1, &var2);
printf("The %d + %d = %d\n", var1, var2, resultCal(add, var1, var2));
printf("The %d - %d = %d\n", var1, var2, resultCal(sub, var1, var2));
printf("The %d * %d = %d\n", var1, var2, resultCal(mul, var1, var2));
printf("The %d / %d = %d\n", var1, var2, resultCal(div, var1, var2));
printf("The %d %% %d = %d\n", var1, var2, resultCal(mod, var1, var2)); return ;
}

    可以看到,借助函数指针令函数调用更加灵活。

22深入理解C指针之---通过指针传递函数的更多相关文章

  1. 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包

    浅谈 .NET 中的对象引用.非托管指针和托管指针   目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...

  2. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

  3. 关于C语言的指针数组与指针数组的个人理解

    一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...

  4. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  5. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  6. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  7. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  8. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  9. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

  10. typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

    首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...

随机推荐

  1. Linux-CentOS6.9启动流程排错

    1 . CentOS6.9启动流程 POST 加电自检,是BIOS功能的一个主要部分.负责完成对CPU.主板.内存.硬盘子系统.显示子系统.串并行接口.键盘.CD-ROM光驱等硬件情况的检测. Boo ...

  2. 如何用纯 CSS 创作一个小球反弹的动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 ...

  3. Yii2 基于rbac访问控制

    Yii2 是一款非常强大的PHP底层框架, 牛b的人都喜欢用它, 有时候你们可能会发现, Yii2 底层处理不是很好, 比如: 每次分页, yii底层都会多统计一次数据的总条数!  那只能说你对它还不 ...

  4. guava笔记

    ​guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点.刚刚接触就被guava吸引了... ​    ​这个是gua ...

  5. python爬虫集合

    逐渐也写了有二十余篇博文,内容一多就导致有些内容不能够方便快捷定位. 虽然博客有标签进行分类,实际查找时也并不如做一个同类文章的集合来得直观. 这里就对python爬虫相关博文做个集合: 爬虫基础知识 ...

  6. poj 3616 奶牛产奶问题 dp算法

    题意:奶牛产奶,农夫有m个时间段可以挤奶,在工作时间 f t 内产奶量为m,每次挤完奶后,奶牛需要休息R.问:怎么安排使得产奶量最大? 思路:区间dp  dp[i]表示第i个时段 对农夫工作的结束时间 ...

  7. Mysql主键一致时,可以进行在元数据上的操作

    insert into daliy_hit_counter(day,slot,cnt) values(12,12,1) on duplicate key update cnt = cnt +1 dal ...

  8. python偏函数使用

    偏函数依托于python functools模块.

  9. 使用supervisor方便调试程序

    调试过程中,有时需要修改代码,并时刻看到运行效果.如果每次终止程序又重启,会很麻烦. 可以使用supervisor,它可以监听代码文件,一旦发生改动会自动重启程序. 安装supervisor命令: n ...

  10. Python虚拟机函数机制之闭包和装饰器(七)

    函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完 ...