函数指针的基本用法
来源:互联网 发布:java创建多线程数组 编辑:程序博客网 时间:2024/06/05 04:28
函数指针函数指针的定义和基本使用void __cdecl fnTest(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void fn_classroom_examples3(){ /// 函数指针 /// 语法, 原理, 存在的意义(搞软件设计用的) /// 函数指针定义 void (__cdecl *pfnTest)(char, int) = NULL; pfnTest = &fnTest; ///< 和 pfnTest = fnTest; 相同效果 pfnTest 值都一样 /// pfnTest地址和函数入口地址并不相同 /// 在Debug模式下, pfnTest是一个跳转向量的地址 /// 在这个跳转表地址中,才jmp到程序真正的入口. /// 可以看到跳到的地址是0x0040段地址开头, 默认情况下, 代码段地址是0x0040开头 /// @ILT+0(_fnTest): /// 00401005 E9 96 00 00 00 jmp fnTest (004010a0) pfnTest('1', 1); (*pfnTest)('1', 1); ///< (*pfnTest) 和 pfnTest 相同 pfnTest = fnTest; pfnTest('1', 1);}函数指针的意义在C语言中, 用函数指针实现多态.UI, 业务, 算法 要分开.对于同样的数据, 在算法不同时, 传入不同的算法函数指针, 非常简洁.如果传入的函数指针,来源为配置文件或网络包, 可以实现源码不用修改, 就可以完成不同的需求.函数指针用于数量未知服务的处理, 使主程序免于编译, 使数据使用算法时灵活.函数指针抽象软件设计, 简化软件设计.当需求变化时,函数指针特别有用.数据和算法需要分离时, 需要用函数指针.函数指针作为函数参数,实现回调void __cdecl fnTest1(char cParam1, int iParam2, void (__cdecl *pfnTest2)(char, int)){ if (NULL != pfnTest2) { pfnTest2(cParam1, iParam2); }}void __cdecl fnTest2(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void fn_classroom_examples4(){ /// 函数指针作为函数参数, 实现回调 fnTest1('1', 1, &fnTest2); ///< 参数3 为 &fnTest2 和 fnTest2 都可 fnTest1('1', 1, fnTest2);}函数指针数组的定义和使用void __cdecl fnTest2(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void __cdecl fnTest2_0(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void fn_classroom_examples5(){ /// 函数指针数组的定义和使用 int i = 0; void (__cdecl *pfnArr[])(char, int) = {fnTest2, fnTest2_0}; for (i = 0; i < (sizeof(pfnArr) / sizeof(pfnArr[0])); i++) { pfnArr[i]('1', 1); ///< 这么写,在语法层面上显得很怪 (*pfnArr[i])('1', 1); ///< 在使用指针数组的情况下, 这么写看着比较顺眼 }}使用函数指针的别名, 简化书写void __cdecl fnTest2(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void __cdecl fnTest2_0(char cParam1, int iParam2){ printf("%c, %d\n", cParam1, iParam2);}void fn_classroom_examples6(){ int i = 0; /// 使用函数指针的别名, 简化程序输入 typedef void (__cdecl *PFN_TEST)(char, int); PFN_TEST pfn = NULL; PFN_TEST pfnArr[] = {fnTest2, fnTest2_0}; pfn = fnTest2; pfn('1', 1); for (i = 0; i < (sizeof(pfnArr) / sizeof(pfnArr[0])); i++) { pfnArr[i]('1', 1); ///< 这么写,在语法层面上显得很怪 (*pfnArr[i])('1', 1); ///< 在使用指针数组的情况下, 这么写看着比较顺眼 }}使用函数指针的注意事项如果函数参数不同, 强转会导致栈不平衡, 产生崩溃
0 0
- 函数指针的基本用法
- 函数指针与函数指针数组的基本用法
- 指针的基本用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- 函数指针的用法
- apach+https安装过程出现的问题
- java递归求八皇后问题(所有摆放方式)
- 在试图改变这个世界的时候,请保留一份敬畏
- Docker实战(五):Docker安装Tomcat
- make our memcpy and memmove
- 函数指针的基本用法
- 欢迎使用CSDN-markdown编辑器
- hadoop思维:HDFS和MapReduce
- 黑马程序员_iOS_C语言实现排序、查找和插入
- [博客]Limboy
- 对于简单模拟路由寻路算法代码的学习。
- SMART原则助你设定有效目标
- RSync实现文件备份同步详解
- 在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs