typedef 定义函数指针

typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。

第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。


在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?

int (*s_calc_func(char op))(int, int);

如果不知道,请看下面的程序,里面有比较详细的说明

// 定义四个函数

int add(int, int);

int sub(int, int);

int mul(int, int);

int div(int, int);

// 定义指向这类函数的指针

typedef int (*FP_CALC)(int, int);

// 我先不介绍,大家能看懂下一行的内容吗?

int (*s_calc_func(char op))(int, int);

// 下一行的内容与上一行完全相同,

// 定义一个函数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)) (int, int)

{

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)(int, int) = 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 int (*pFunc)(int, int);
pFunc function1(char op);

// 上面的定义等同下面的定义:
// int (*function1(char op))(int, int);

// 以下代码演示函数指针的用法
int add(int a, int b)
{
return a + b;
}

int (*function2(char op))(int, int)
{
return function1(op);
}

pFunc function1(char op)
{
switch (op) {
case '+': return add;
default: return NULL;
}

return NULL;
}

int calc_func(int a, int b, char op)
{
pFunc fp = function1(op);
return fp(a, b);
}

// 计算a、b的和
int a = 100, b = 200;
int c = calc_func(a, b, '+');


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值