本文希望解决以下问题:
1
、
typedef
的基本概念
2
、函数指针的基本概念
3
、
typedef void(*Func)(void)
的由来
4
、
typedef void(*Func)(void)
的用途
题外话:跟
typedef
有个很类似的关键字时
#define
,两者其实是有区别的,这里就不详细说,只做简单阐述
typedef
语句是在编译过程中被解析的,而
#define
是在编译之前的预处理过程中被解析的。
#define
所进行的只是对自定义别名的简单替换,而
typedef
则要灵活得多。总的来说,
typedef
可以做到
#define
所能做的所有事情,而且可以做得更好
,
但是两者是不一样的,详细区别请自行百度。
正式内容:
-
1
、
typedef—
声明,简称
typedef
,为现有类型创建一个新的名字。比如人们常常使用
typedef
来编写更美观和可读的代码。所谓美观,意指
typedef
能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。
基本用法:
typedef unsigned char UCHAR;
右边代替左边
使用
UCHAR i
语句就等同于
unsigned char i;
-
2
、函数指针的基本概念
说到函数指针
,
必然会提到指针函数
,
简单阐述
,
也可自行百度
.
1)
指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
类型标识符
*
函数名
(
参数表
)
int *f(x
,
y);/*
声明一个指针函数
*/
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
[cpp]
view plain
copy
-
float
*fun();
-
float
*p;
-
p = fun(a);
2)
函数指针是指向函数的指针变量,他的本质是一个指针变量。
类型说明符
(*
函数名
)(
参数
)
int (*f) (int x); /*
声明一个函数指针
*/
f=func; /*
将
func
函数的首地址赋给指针
f */
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。
其主要的区别是一个是指针变量,一个是函数。
-
3
、
typedef void(*Func)(void)
的由来
其实这样的形式声明函数指针是有
”
问题
”
的。如果仿照变量类型声明,声明函数指针似乎应该这样:
typedef void(*)() variable;
但是
c
标准的创建者没有这样做,不知道为什么,而选择了这样的声明:
typedef void(*variable)();
C
编译器非常清楚,这就是在声明一个
void(*)()
类型的函数指针
variable
。
-
4
、
typedef void(*Func)(void)
的用途
先来看下其基本用法
[cpp]
view plain
copy
-
typedef
void
(*func)(
void
);
-
void
myfunc(
void
);
-
func pfun = myfunc;
/*
赋值
*/
-
pfun();
/*
调用
*/
typedef void(*Func)(void)
的用途
用法的好处:
定义一个函数指针类型
。
例子
:
有三个类型相似或功能相似的函数
:
[cpp]
view plain
copy
-
void
TASK1(
void
) { printf(
“I’m TASK1”
); }
//
函数定义
-
void
TASK2(
void
) { printf(
“I’m TASK2”
); }
//
函数定义
-
void
TASK3(
void
) { printf(
“I’m TASK3”
); }
//
函数定义
-
… …
-
typdef
void
(*func)(
void
);
//
声明
至此,我们就已经构造好了通用函数
还需要定义一个调用的函数
[cpp]
view plain
copy
-
void
gTASK(
char
i)
-
{
-
func vTask[3] = {&TASK1, &TASK2, &TASK3};
-
func fun = vTask[i];
-
(*fun)();
-
}
使用
gTASK
来执行:
执行
gTASK(1)
会打印出
I
‘m TASK1
执行
gTASK(2)
会打印出
I
‘m TASK2
执行
gTASK(3)
会打印出
I
‘m TASK3
PS:typdef void (*func)(void);
还有很多好的用处,
操作系统
源码都用的很巧妙,有空我总结出来,再分享。