使用typedef定义函数指针

本文通过实例详细介绍了函数指针的基础概念及应用技巧,包括如何定义和使用函数指针,利用typedef简化指针声明,以及如何通过函数指针实现动态选择函数等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简单的函数指针的应用

形式1:返回类型(*函数名)(参数表) 

[cpp]  view plain copy
  1. char (*pFun)(int);   
  2. char glFun(int a){ return;}   
  3. void main()   
  4. {   
  5.     pFun = glFun;   
  6.     (*pFun)(2);   
  7. }  


         第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
         第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址
         然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。

2.使用typedef更直观更方便

形式1:typedef  返回类型(*新类型)(参数表)

[cpp]  view plain copy
  1. typedef char (*PTRFUN)(int);   
  2. PTRFUN pFun;   
  3. char glFun(int a){ return;}   
  4. void main()   
  5. {   
  6.     pFun = glFun;   
  7.     (*pFun)(2);   
  8. }   

            typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
           第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。

3.例子说明

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <assert.h>  
  3.   
  4. typedef int (*FP_CALC)(int,int);//定义一个函数指针类型  
  5.   
  6. int add(int a, int b)  
  7. {  
  8.     return a + b;  
  9. }  
  10.   
  11. int sub(int a, int b)  
  12. {  
  13.     return a - b;  
  14. }  
  15.   
  16. int mul(int a, int b)  
  17. {  
  18.     return a * b;  
  19. }  
  20.   
  21. int div(int a, int b)  
  22. {  
  23.     return b ? a/b : -1;  
  24. }  
  25.   
  26. //定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、  
  27. //返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址  
  28. FP_CALC calc_func(char op)  
  29. {  
  30.     switch( op )  
  31.     {  
  32.     case '+':  
  33.         return add;  
  34.     case '-':  
  35.         return sub;  
  36.     case '*':  
  37.         return mul;  
  38.     case '/':  
  39.         return div;  
  40.     default:  
  41.         return NULL;  
  42.     }  
  43.     return NULL;  
  44. }  
  45.   
  46. //s_calc_func为函数,它的参数是 op,     
  47. //返回值为一个拥有两个int参数、返回类型为int的函数指针    
  48. int (*s_calc_func(char op)) (int , int)  
  49. {  
  50.     return calc_func(op);  
  51. }  
  52.   
  53. //最终用户直接调用的函数,该函数接收两个int整数,  
  54. //和一个算术运算符,返回两数的运算结果  
  55. int calc(int a, int b, char op)  
  56. {  
  57.     FP_CALC fp = calc_func(op);  
  58.     int (*s_fp)(int,int) = s_calc_func(op);//用于测试  
  59.   
  60.     assert(fp == s_fp);// 可以断言这两个是相等的  
  61.   
  62.     if(fp)  
  63.         return fp(a,b);  
  64.     else  
  65.         return -1;  
  66. }  
  67.   
  68. void main()  
  69. {  
  70.     int a = 100, b = 20;  
  71.   
  72.     printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));  
  73.     printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));     
  74.     printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));     
  75.     printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));   
  76. }  
<think>好的,我现在需要帮助用户了解如何在C/C++中使用typedef定义函数指针。首先,我得回忆一下相关知识点,确保自己理解正确。typedef的作用是给类型起别名,函数指针的声明可能有点复杂,特别是对于新手来说,所以需要一步步解释清楚。 首先,我应该从函数指针的基本概念讲起。函数指针是指向函数的指针变量,可以像普通函数一样被调用。然后,引入typedef来简化函数指针类型的声明。比如,正常声明一个函数指针可能比较繁琐,特别是当函数参数复杂时,使用typedef可以让代码更易读。 接下来,我需要举一个简单的例子,说明如何定义使用typedef函数指针类型。比如,先定义一个函数,比如int func(char ch),然后创建一个指向这类函数的指针类型。这里可能需要解释typedef的语法结构:typedef 返回类型 (*类型名)(参数列表)。例如,typedef int (*ptrFunc)(char); 这里ptrFunc就是新类型名,可以用于声明变量。 然后,展示如何在主函数中使用这个类型,比如声明ptrFunc pFunc = func; 然后调用pFunc('n');。这样用户可以看到整个流程:定义函数、定义类型、声明变量、使用变量调用函数。 用户提供的引用中有两个例子,引用1中的b.cpp和引用2中的CompareFunction。我需要确保我的例子与这些引用一致,同时补充说明可能的应用场景,比如回调函数或者比较函数,比如在排序算法中传递不同的比较逻辑。 可能还需要提到typedef在C和C++中的使用差异,但用户主要问的是C/C++,所以可能不需要深入区别,但可以简单提到在C++中可能有其他方式(如using关键字),但typedef仍然是有效的。 用户的问题还可能涉及到更复杂的函数指针,比如带有多个参数或不同返回类型的例子,所以可能需要再举一个稍微复杂点的例子,比如引用2中的CompareFunction,用于比较两个整数,这样用户可以看到不同参数的情况。 另外,需要提醒常见的错误,比如函数签名不匹配,或者忘记typedef的语法结构,比如括号的位置和星号的位置是否正确。例如,如果写成typedef int *ptrFunc(char); 这样就错误地定义一个函数类型,而不是函数指针类型。 最后,总结一下步骤:1. 确定函数签名;2. 使用typedef定义类型;3. 声明变量并赋值;4. 通过指针调用函数。同时强调typedef的好处:提高可读性,减少重复代码,方便维护。 现在检查是否有遗漏的点,比如是否提到了const的正确使用,或者函数指针数组的情况?不过用户的问题集中在基本使用方法,可能不需要太深入。但如果有相关的问题生成,可以包括这些进阶内容。 确保LaTeX格式正确,用户提到行内数学表达式用$...$,但这里可能不需要数学公式,但代码部分需要用正确的格式。用户示例中的代码用了```python,但这里需要用C++代码,所以需要注意语法高亮是否正确,不过用户可能接受没有高亮,只要代码正确。 最后,生成相关问题时要覆盖定义方法、应用场景、优势、错误处理等,比如如何定义带参数的函数指针类型,typedef与using的区别,函数指针在回调中的应用等。</think>在C/C++中,使用`typedef`定义函数指针可以提高代码可读性,其核心语法为:`typedef 返回类型 (*类型名)(参数列表)`。以下是具体实现方法和示例: ### 一、基本定义方法 1. **确定函数原型** 例如要定义指向`int func(char)`类型函数的指针,其函数签名为`int (char)` 2. **使用typedef创建别名** ```cpp typedef int (*ptrFunc)(char); // ptrFunc成为类型名称 ``` 3. **声明变量并赋值** ```cpp int func(char ch) { /*...*/ } ptrFunc pFunc = func; // 等价于 int (*pFunc)(char) = func; ``` ### 二、代码示例 ```cpp #include <iostream> int logger(char ch) { std::cout << "[LOG] " << ch << std::endl; return 0; } typedef int (*LogHandler)(char); // 定义日志处理函数指针类型 int main() { LogHandler handle = logger; handle('A'); // 输出:[LOG] A return 0; } ``` 该示例通过`LogHandler`类型实现了函数调用的抽象化[^1]。 ### 三、进阶用法 **多参数场景**(如比较函数): ```cpp typedef int (*Comparator)(int, int); // 定义比较器类型 int asc_compare(int a, int b) { return a - b; } int desc_compare(int a, int b) { return b - a; } void sort(int* arr, int n, Comparator cmp) { // 使用cmp进行排序... } ``` 这种方式在排序算法中实现策略模式[^2]。 ### 四、注意事项 1. **类型匹配**:函数指针赋值时需严格匹配参数和返回类型 2. **语法陷阱**:`typedef int *ptr(char);` 实际定义的是返回`int*`的函数类型 3. **C++11扩展**:可使用`using`关键字替代: ```cpp using Handler = int (*)(char); // 等效typedef定义 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值