函数指针和指针函数的定义和调用

确实第一次听到函数指针和指针函数的时候感觉特别的绕。而且昨天要写函数指针的时候一下子想不起来,自己写篇文章和大家分享一下也让我增加印象。

指针函数

指针是函数的返回类型
int*  Fun(void);
int*是一个int类型的指针,作为函数的返回值
声明格式:类型说明符* 函数名(参数)
int* Fun1(int data1);
返回值类型一定要是个指针

函数指针

是代表函数入口地址的变量
函数本体: int Fun(int);
函数指针  in (*p)(int) = Fun;
声明格式:类型说明符 (*函数名) (参数)
int (*Fun1)(int);

注意:类型说明符和参数的类型数量是根据你要保存的函数的格式一样的

p保存了Fun函数的入口地址
函数调用上
int a = 5;
p(5)等价于Fun(5)

我先将函数Fun1的地址存入函数指针p中
然后分别调用Fun和p进行输出,结果下图这样。
大家可以去试试。代码我贴在下面

#include <iostream>
#include <Windows.h>int Fun1(int data1) {static int i;i++;printf("第%d次:data1 = %d\n", i,data1);return data1;
}void Fun_ALL(int (*p)(int), int a) {p(a);
}int main() {int(*p)(int) = Fun1;Fun_ALL(Fun1, 3);Fun_ALL(p, 5);system("pause");return 0;
}

用途:
有人会问函数指针还要多开一个变量,还要去保存,写成这样干啥哦,浪费空间和时间,其实不然,函数指针在某一个函数中需要调用同类型的函数时很有用的,你只需要把你自己的函数名称传入即可,不然的话就是要做标志位参数去判断了,这样不仅更浪费空间而且代码会变得很冗余的。
抛砖引玉一下:
先上运行结果

基础运算代码(就是简单的加减乘除)

//加法
int sum(int data1, int data2) {printf("sum: %d + %d = %d\n", data1, data2, data1 + data2);return data1 + data2;
}
//减法
int sub(int data1, int data2) {printf("sub: %d - %d = %d\n", data1, data2, data1 - data2);return data1 - data2;
}
//乘法
int mul(int data1, int data2) {printf("mul: %d * %d = %d\n", data1, data2, data1 * data2);return data1 * data2;
}
//除法
int division(int data1, int data2) {printf("div: %d / %d = %d\n", data1, data2, data1 / data2);return data1 / data2;
}

运算整合代码

int Fun( int (*p1)(int, int),        //第一个运算int (*p2)(int, int),     //第二个运算int (*p3)(int, int),     //第三个运算int data1, int data2) {int res = 0;res = p3( p2( p1(data1, data2), data1), data1);printf("Res:%d\n", res);return res;
}

main函数

int main() {Fun(division, sum, mul, 20, 4);system("pause");return 0;
}

运行结果:

函数指针还有很多的用途啦,指针用的话,大神跑不了,哈哈哈哈哈。

C语言函数指针和指针函数的定义和调用相关推荐

  1. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

    C语言:一个涉及指针函数返回值与printf乱码.内存堆栈的经典案例 一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中 ...

  2. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

    文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...

  3. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  4. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  5. C语言什么时候必须用到二级指针?(需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针)

    结论:需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针 例子:为空指针p开辟内存空间 1.不用二级指针(无法实现) #include <stdio.h> ...

  6. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  7. 【示例】C语言中利用数组存放函数指针

    C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...

  8. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  9. c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...

    在C语言程序开发中,动态内存分配是不可避免的,而调用 malloc()/free() 库函数实现这一过程是方便的,事实上,在很多C语言程序中,malloc/free 库函数的使用相当频繁,它俩的C语言 ...

  10. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

最新文章

  1. 观点 | 医疗AI:新瓶装旧酒VS新瓶装新酒?——道彤投资创始合伙人孙琦
  2. C#中的Dictionary简介
  3. 查看dataloader的大小_一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
  4. DDR3 IP设计说明
  5. linux下postgresql离线编译安装
  6. 自旋锁--Test and Set Clock机制分析
  7. sublime Text3下sass环境配置(windows)
  8. 如何制作响应式网站?12个优秀案例参考
  9. 金融银行测试面试题:网上银行转账是怎么测的?
  10. Yii2.0 SESSION使用方法
  11. linux通过修改/etc/hosts文件 添加IP地址与域名的映射
  12. 魔兽争霸III—冰封王座6级考试
  13. javascript atob()函数和 btoa()函数-Base64的编码与解码
  14. VS2013使用教程总结(2)---显示行号
  15. jenkins启动一直显示 Jenkins正在启动,请稍后...
  16. 榆熙电商:拼多多商家怎样开通电子面单服务?有何优势?
  17. 使用turtle 绘制正方形和圆
  18. 三维坐标变换——旋转矩阵与旋转向量
  19. 浪潮受邀出席“市长论坛-深圳智慧城市国际圆桌研讨会”
  20. 用心做事,踏实做人,乐观面对,积极应对

热门文章

  1. matlab 有限域函数,matlab有限域上的运算.docx
  2. python汉化界面_python如何设置中文界面
  3. python微信自动发消息系统
  4. android 人脸识别边框_虹软人脸识别 - Android Camera实时人脸追踪画框适配
  5. R语言实现地理探测器的流程及代码
  6. matlab在机电一体化的仿真图,基于simulink的机电一体化系统案例仿真教学研究
  7. 【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机
  8. matlab 反复激活无效——许可证到期
  9. 电脑整蛊关机html代码,恶搞关机的脚本小程序 -电脑资料
  10. 学生请假管理系统--UML画图