函数指针的基本用法

来源:互联网 发布: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
原创粉丝点击