参考链接
一、概念
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称。
示例:
typedef int BOOL;//定义一个布尔类型
#define TRUE 1
#define FALSE 0
//定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:
BOOL bflag=TRUE;
二、typedef的4种用法
-
为基本数据类型定义新的类型名
比如跨平台时,有的机子不支持long double,但有需要高精度的一个类型参与计算,那就可以进行如下定义:
typedef long double ACCURACY;//当跨平台时,只需修改long double的类型就可以了,如下
typedef double ACCURACY;
- 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
以结构体为例,下面我们定义一个名为 Point 的结构体:
struct Point
{
double x;
double y;
double z;
};
在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:
struct Point oPoint1={100,100,0};
struct Point oPoint2;
上面是传统定义方法,下面是利用typedef的升级版:
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
在上面的代码中,实际上完成了两个操作:
1、定义了一个新的结构类型,代码如下所示:
struct tagPoint
{
double x;
double y;
double z;
} ;
其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。
2、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:
typedef struct tagPoint Point
综上:现在就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:
Point oPoint1={100,100,0};
Point oPoint2;
如果上面结构体的声明没看懂可以先看下这个:
#include <>
typedef int A,*B;//定义两个类型,一个整型的别名A,一个整型指针B,这两个变量没有联系,谁也代表不了谁,都是独立的。
int main()
{
A aa=10;
B bb;
*bb=12;
printf("&aa=%p\n",&aa);
printf("bb=%p\n",bb);
printf("aa=%d\n",aa);
printf("*bb=%d\n",*bb);
return 0;
}
#include <>
#include <>
#define MAXSIZE 100 // 顺序表的最大长度
typedef int ElemType; // 自定义顺序表的数据元素为整数。
typedef struct
{
ElemType data[MAXSIZE]; // 用数组存储顺序表中的元素
unsigned int length; // 顺序表中元素的个数
}SeqList,*PSeqList;//这个就是定义两个类型,一个是结构体别名SeqList和一个结构体指针PSeqList。
- 为数组定义简洁的类型名称
与为基本数据类型定义新的别名方法一样,示例代码如下所示:
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;
- 为指针定义简洁的名称
对于指针,我们同样可以使用下面的方式来定义一个新的别名:
typedef char* PCHAR;
PCHAR pa;
例如有下面这种类型,上面这个方法就有大用处了:
int *(*a[5])(int,char*);
// PFun是我们创建的一个类型别名
typedef int *(*PFun)(int,char*);
// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
PFun a[5];