typedef 函数指针的用法

“做学问就要有打破沙锅问到底的精神!”

碰到问题就绕着走,以后碰到了要再花一倍时间来弄懂它,

既然始终绕不开,索性就把他解决掉!!!

目录

1、用法1:定义指向特定类型函数的指针别名。语法:typedef int (*MYFUN)(int, int); 

2、用法2:typedef 给变量类型定义一个别名.

3、实例

 typedef 行为有点像 #define 宏,用其同义字替代实际类型,不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换

1、用法1:定义指向特定类型函数的指针别名。语法:typedef int (*MYFUN)(int, int); 


这种用法一般用在给(函数定义别名)的时候。

上面的例子定义MYFUN 是一个(函数指针, 函数类型是带(两个int 参数), 返回(一个int) 。

分析这种形式的定义的时候可以用下面的方法:

 先去掉(typedef) 和(别名剩下的就是(原变量的类型).

比如,去掉typedef和MYFUN以后就剩: int (*)(int, int),要特别注意,这个形式其实表示的是一个(指向某种特定类型函数的指针),本例中函数类型是带(两个int 参数), 返回(一个int)的函数。 typedef int (*MYFUN)(int, int) 的作用其实就是在给int (*)(int, int)这个指针函数定义(别名)

typedef char(*pFun)(int)  //也可写成:char(*pFun)(int);
/*typedef的功能是定义新的类型。第一句就是定义了一种PFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

char glFun(int a){return;}
//定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。

void main()

{

pFun =glFun; //对指针进行赋值。

(*pFun)(2);  //通过指针调用函数glFun。

}

2、用法2:typedef 给变量类型定义一个别名.

typedef struct{ 
int a; 
int b; 
}MY_TYPE; 

这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: 

MY_TYPE tmp;

3、实例

//#include<iostream.h>
#include<stdio.h>


typedef int (*FP_CALC)(int, int);
//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看
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,返回一个指针,该指针类型为FP_CALC,它是一个拥有两个int参数、
//返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址;
//它的作用其实是引入第三个参数,来选择我究竟选择“+”、“-”、“*”,“/”哪一个运算式;
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;
}


//s_calc_func为函数,它的参数是 op,
//返回值为一个拥有两个int参数、返回类型为int 的函数指针
//它的功能类似于calc_func(op),其实它最终也是调用的calc_func(op)
//说明定义函数指针的方式非常简洁;
int (*s_calc_func(char op)) (int, int)
{
return calc_func(op);
}


//最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
int calc(int a, int b, char op)
{
FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址
int (*s_fp)(int, int) = s_calc_func(op);//用于测试
//ASSERT(fp == s_fp);   // 可以断言这俩是相等的

if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果
else return -1;

//以下这几种为函数赋值的方法都是可以的,
//if (fp == s_fp) return s_fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果
//if (fp) return (*fp)(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果

}
void main()
{
int a = 110, 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, '/'));
}

参考学习了“code2012“的:https://www.cnblogs.com/shenlian/archive/2011/05/21/2053149.html,谢谢!

发布了34 篇原创文章 · 获赞 12 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zhou8201/article/details/100700479