typedef和指向函数的指针(好文,经典)(1读)

本文详细解析了C语言中函数指针的概念,特别是指向函数的指针的定义及使用方法,并通过具体示例展示了如何根据操作符选择并执行不同的数学运算。
在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?
 
int (*s_calc_func(char op))(intint);
 
如果不知道,请看下面的程序,里面有比较详细的说明

程序开始: 
// 定义四个函数
int add(intint);
int sub(intint);
int mul(intint);
int div(intint);

// 定义指向这类函数的指针
typedef int (*FP_CALC)(intint);
 
// 我先不介绍,大家能看懂下一行的内容吗?
int (*s_calc_func(char op))(intint);
 
// 下一行的内容与上一行完全相同,
// 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针
FP_CALC calc_func(char op);
 
// 根据 op 返回相应的计算结果值
int calc(int a, int b, char op);

//============================================================== 
int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int mul(int a, int b)
{
    return a * b;
}

int div(int a, int b)
{
    return b? a/b : -1;
}

// 这个函数的用途与下一个函数作业和调用方式的完全相同,
// 参数为op,而不是最后的两个整形
int (*s_calc_func(char op)) (intint)
{
    return calc_func(op);
}
 
FP_CALC calc_func(char op)
{
    switch (op)
    {
    case '+': return add;
    case '-': return sub;
    case '*': return mul;
    case '/': return div;
    default:
        return NULL;
    }
    return NULL;
}
 
int calc(int a, int b, char op)
{
    FP_CALC fp = calc_func(op); // 下面是类似的直接定义指向函数指针变量
    // 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!
    int (*s_fp)(intint) = s_calc_func(op);
    // ASSERT(fp == s_fp); // 可以断言这俩是相等的
    if (fp)
 return fp(a, b);
    else 
return -1;
}
 
void test_fun()
{
    int a = 100, b = 20;
    printf("calc(%d, %d, %c) = %d/n", a, b, '+', calc(a, b, '+'));
    printf("calc(%d, %d, %c) = %d/n", a, b, '-', calc(a, b, '-'));
    printf("calc(%d, %d, %c) = %d/n", a, b, '*', calc(a, b, '*'));
    printf("calc(%d, %d, %c) = %d/n", a, b, '/', calc(a, b, '/'));
}
 
运行结果
   calc(100, 20, +) = 120
   calc(100, 20, -) = 80
   calc(100, 20, *) = 2000
   calc(100, 20, /) = 5


### 使用 `typedef` 简化函数指针的定义使用方法 在 C C++ 中,函数指针的声明通常较为复杂,容易导致代码可性下降。通过 `typedef`,可以为函数指针创建一个简洁的别名,从而简化其定义使用[^2]。 #### 1. `typedef` 定义函数指针的基本语法 `typedef` 的作用是为现有类型创建一个新的名字(别名)。对于函数指针,可以通过以下方式定义: ```c typedef 返回值类型 (*别名)(参数列表); ``` 例如,定义一个指向返回 `int` 类型并接收两个 `int` 参数的函数指针: ```c typedef int (*MYFUN)(int, int); // 定义 MYFUN函数指针的别名 ``` 这样,`MYFUN` 就成为了一个新的类型名称,表示指向特定签名函数指针[^3]。 #### 2. 使用 `typedef` 定义的函数指针 一旦定义了函数指针的别名,就可以像普通变量一样使用它。例如: ```c #include <stdio.h> // 定义函数 int add(int a, int b) { return a + b; } // 使用 typedef 定义函数指针别名 typedef int (*MYFUN)(int, int); // 测试函数 void testFunction(MYFUN func, int x, int y) { printf("Result: %d\n", func(x, y)); } int main() { MYFUN ptr = add; // 使用 typedef 定义的别名 testFunction(ptr, 5, 3); // 调用函数 return 0; } ``` #### 3. `typedef` 的优势 通过 `typedef`,可以显著简化函数指针的声明使用。例如,直接声明函数指针时需要如下形式: ```c int (*funcPtr)(int, int); ``` 而使用 `typedef` 后,只需简单地声明: ```c MYFUN funcPtr; ``` 这种简化不仅提高了代码的可性,还减少了出错的可能性[^4]。 #### 4. 示例:结合 `typedef` 函数指针实现动态行为 以下是一个更复杂的示例,展示如何通过 `typedef` 函数指针实现动态调用不同函数的行为: ```c #include <stdio.h> // 定义多个函数 int multiply(int a, int b) { return a * b; } int divide(int a, int b) { return b != 0 ? a / b : 0; } // 使用 typedef 定义函数指针别名 typedef int (*MYFUN)(int, int); // 动态调用函数 void performOperation(int a, int b, MYFUN operation) { printf("Result: %d\n", operation(a, b)); } int main() { int x = 10, y = 2; // 动态选择函数 performOperation(x, y, multiply); performOperation(x, y, divide); return 0; } ``` #### 5. 注意事项 - 在定义 `typedef` 时,确保函数指针的签名实际函数匹配,否则会导致未定义行为。 - 使用 `typedef` 定义的函数指针别名时,必须遵循 C/C++ 的语法规则[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值