typedef,看名称,就是类型定义,它,真的就用在类型定义。

它创建一种新的数据类型名称。

注意,是数据类型名称,不是数据类型。

也就是说,typedef并不创建新的类型,typedef只是在已有数据类型(比如 int,char等)上,给这个已有类型起一个别名。 

typedef 应用场景:

 1. 变量:

typedef int Length;    // 给int数据类型创建一个名称,叫Length;
Length len, maxlen;    // 可以用Length代替int,声明变量,声明的变量,数据类型就是int.
                                    // 这个声明,等同于 int len, maxlen;

2. 指针:

typedef char *String;                    // 给char *这个指针类型创建一个名称,叫String
String rich = "I am a rich man!";        // 等同于 char *rich = "I am a rich man!";

3. 结构体:

// 包含结构体stRect声明,
// 和typedef结构体类型stRect一个新的名称 Rect
typedef struct stRect
{
    int x;
    int y;
    int width;
    int height;
}Rect;
Rect size;            // 等同于struct stRect size;

或者

struct stRect
{
    int x;
    int y;
    int width;
    int heigth;
};                // 先声明一个结构体
typedef sturct stRect Rect;        // 再用typedef生成一个名称 Rect;
Rect size;            // 等同于 struct stRect size;

4. 函数指针。

void (*pf1)(int);
void (*pf2)(int);
void (*pf3)(int);

声明三个函数指针,

这三个函数指针可以用来指向一个无返回值(void),有一个int参数的函数;

每次声明函数指针,都差不多要跟声明函数原型一样了,敲这个多字符,好累好烦怎么办?

typedef void (*pFUNC)(int);        // 给"无返回值,有一个int参数的函数指针"类型生成一个新名称,叫pFUNC;
pFUNC pf1, pf2, pf3, pf4;    // 比 void (*pf1)(int)..这种轻松多了吧?

或者

typedef void FUNC(int);            // 给"无返回值,有一个int参数的函数"类型生成一个新名称,叫FUNC;
FUNC *pf1. *pf2. *pf3, *pf4;        // 既然类型是 FUNC,那指针,便是 FUNC *;

TIPS:

typedef 能否用 #define 来代替?比如 typedef int Length,可否替换成 #define Length int?

某些应用场合上是可以的,比如 typedef int Length,替换成 #define Length int,完全没有问题;

但它俩是完全不同的概念

#define 是预处理指令,只是简单地做字符串替换,不做类型检查;
#define Length int在预处理时把相关的Length字符串替换成int;
#define Length intxxxxxaabb,不进行变量声明(Length aa),编译也是能通过的。
typedef 是关键字,在编译时处理,做类型检查。
typedef int Length后,Length 就是一种类型,这种类型跟int一样。
typedef intxxxaaaba Length,不管进不进行变量声明,是无法通过编译的。

typedef 的作用:

1. 提高程序的可移植性,方便程序在不同平台上移植。

    比如,定义一个变量,其值范围是0~0xABCDEF13;

    在 32 位机上开发程序时,使用 unsigned int var(32位机unsigned int是32位,范围0~0xFFFFFFFF) ,符合!如果要把写好的程序移植到 16 位机上时,unsigned int var长度是16位,范围0~65535,不符合,怎么办呢?

    如果不使用typedef,就需要把程序里所有用unsigned int 声明的变量,全部变成 unsigned long。

    如果使用 typedef,只需要 typedef unsigned int DWORD;在声明变量时,使用 WORD var;如果需要把程序移植到16位机上时,只需要更改一个 typedef unsigned long DWORD 就行了。

2. 提高程序的可读性

    为变量或者结构体,创建一个看起来一目了然的类型名称,让人一眼就知道这个类型是做什么的。