22深入理解C指针之---通过指针传递函数
一、通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址)
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指针之---通过指针传递函数的更多相关文章
- 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包
浅谈 .NET 中的对象引用.非托管指针和托管指针 目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
- 关于C语言的指针数组与指针数组的个人理解
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 深入理解C指针之四:指针和数组
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...
- 深入理解C指针之三:指针和函数
原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...
- typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...
随机推荐
- untiy3d action管理机制的编写
使用unity3d对于一些可视化强迫者来说,是一个不错的选择,但unity3d没有cocos2d的action管理机制,比如cocos2dx的CCMoveTo,CCScale等action,所以笔者通 ...
- NSString 使用 copy、strong
// 首先定义2个属性 @property (nonatomic, strong) NSString *stStr; @property (nonatomic, copy) NSString *coS ...
- VS快捷键总结(开发中经常遇到)
1.窗口快捷键 (大家有没有发现但凡跟窗口挂上钩的快捷键当中都有一个W,那是因为W代表Windows也就是窗口的意思) Ctrl+W,W: 浏览器窗口 (浏览橱窗用有道的翻译是window shop ...
- 酷炫的3D照片墙
今天给大家分享的案例是酷炫的3D照片墙 这个案例主要是通过 CSS3 和原生的 JS 来实现的,接下来我给大家分享一下这个效果实现的过程.博客上不知道怎么放本地视频,所以只能放两张效果截图了. 1.实 ...
- 【kmp】bzoj3620: 似乎在梦中见过的样子
考察kmp理解题 Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中 ...
- SAP 常用业务数据表设计
表的要求表中使用的字段请尽量参照各模块的SAP字段标准使用习惯: 例:"ZXSLRZX销售组织对应的利润中心"中的销售组织应该使用VKORG.利润中心应该使用PRCTR.根据表的 ...
- spring IOC注解与xml配置
转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...
- 02Qt信号与槽(1)
信号与槽 1.概述 信号和槽机制是 Qt 的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是 Qt 的核心特性,也是 Qt 区别于其他工具包的重要地方.信号和槽是 Qt 自行定义的一种 ...
- 【线程池】ExecutorService与quartz搭配出现的问题
问题描述: 使用quartz定时推送微信公众号模板消息,一分钟推送一次,定时器里面使用了一个ExecutorService线程池,大小为5个. 批量获取数据之后,全部数据都被分配到n/5的线程池里面等 ...
- 什么是python中的元类
所属网站分类: python高级 > 面向对象 作者:goodbody 原文链接: http://www.pythonheidong.com/blog/article/11/ 来源:python ...