C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说 允许由用户为数据类型取“别名”。
类型定义符 typedef 即可用来完成此功能。
typedef 定义的一般形式为:
typedef 原类型名 新类型名
其中原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。
有时也可用宏定义来代替 typedef 的功能,但是宏定义是由预处理完成的,而 typedef 则是在编译时完成的,后者更为灵活方便。
1.常规变量类型定义
例如,有整 型量 a,b,其说明如下:
int a,b;
其中 int 是整型变量的类型说明符。int 的完整写法为 integer,为了增加程序的可读性,
可把整型说明符用 typedef 定义为:
typedef int INTEGER
这以后就可用 INTEGER 来代替 int 作整型变量的类型说明了。
例如:
INTEGER a,b; 等效于 int a,b;
2.数组类型定义
用 typedef 定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且 使意义更为明确,因而增强了可读性。
例如:
typedef char My[20]; 表示 My是字符数组类型,数组长度为 20。 My 等价于 char [20]定义;
然后可 用My说明变量,如:
My a1, a2, s1, s2; 等效于 char a1[20],a2[20],s1[20],s2[20];
3.指针类型定义
例如: typedef int * pointer;
描述: pointer 等价于 int * 定义;
pointer a 声明等价于int * a声明
例如: typedef int * pointer[M];
描述: pointer 等价于 int * [M] 定义;
pointer a声明等价于int *a[M]声明明
4.函数地址说明
描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址
例如: 函数: int func(void);
unsigned long funcAddr = (unsigned long)func;
funcAddr的值是func函数的首地址
5.函数声明
例如: typedef int func(void);
func等价于 int (void)类型函数
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针变量的声明,见下一条
6.函数指针
例如: typedef int (*func)(void)
描述: func 等价于 int (* )(void)类型
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量
7.识别typedef的方法:
a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为正确
如typedef u32 (*func)(u8);
从上面的定义中找到 typedef __u32 u32;typedef __u8 u8
继续找到 typedef unsigned int __u32;typedef unsigned char __u8;
替代位置名称 typedef unsigned int (*func)(void);
现在只有func属于未知
b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为
func等价于unsigned unsigned int (*)(unsigned char);
c).第三部.定义一个变量时,变量类型等价于把变量替代未知名字的位置所得到的类型
func f等价于unsigned unsigned int (*f)(unsigned char)