本篇博客主要讲解C语言中的typedef关键字。typedef的作用是类型重定义,可以理解为给类型起一个别名。我主要从3个方面来讲解:
- typedef内置类型。
- typedef自定义类型。
- typedef和#define的区别。
1.typedef内置类型
typedef可以给一个类型起“别名”。比如,如果我这么写:
typedef int zhangsan;
我就给int起了个别名叫"zhangsan"。此时,int就等价于zhangsan,比如int a = 0;
和zhangsan a = 0;
等价。当然,实际使用时,不会起这样的名字,而是根据实际情况,起适当的名字。
举个例子,有一个类型叫unsigned int,我觉得这个类型太长了,就这么写:
typedef unsigned int uint;
此时,所有需要unsigned int类型的地方,就可以用uint来替代。比如,下面两行代码等价。
unsigned int a = 10;
uint a = 10;
当然,不建议把类似unsigned int这样的类型起类似uint这样的别名,因为这样会降低可读性。
2.typedef自定义类型
typedef自定义类型是一个很常见的用法,尤其是对于结构体。比如:
struct Node
{
int data;
struct Node* next;
};
这是一个链表结点的结构体。C语言中,如果用结构体类型创建结构体变量,是不能省略struct的。比如:
struct Node head;
每次都写struct Node是非常复杂的,有么有什么方法可以省略掉struct,直接写类似Node head;
呢?
这就可以使用typedef。
typedef struct Node
{
int data;
struct Node* next;
}Node;
以上的写法中,就给struct Node起了个别名叫"Node",所以就可以直接写类似Node head;
来定义结构体变量了。当然,类似自定义类型,写:
typedef struct Node Node;
也能达到同样的效果。
另外,如果这么写:
typedef struct Node
{
int data;
struct Node* next;
}Node, *pNode;
就是给struct Node*起了个别名叫pNode。
3.typedef和#define的区别
typedef可以给类型起别名,#define只是完成替换,它们有本质的区别。比如:
typedef int* pint;
#define PINT int*
为了区分两者,我用大写的PINT来代表#define定义出来的宏。此时如果有下面一段代码,是什么意思呢?
pint a, b;
PINT c, d;
先说a和b。由于typedef给int*起了个别名叫pint,也就是说,a和b的类型都是int*类型。
但是,c和d都是int*类型吗?并不是,这就容易引起误解。因为#define是在预处理阶段完成文本替换,会把PINT直接替换成int*,此时的代码就变成了:
int* c, d;
等价于int *c, d;
,c是int*类型的,但是d只是一个int类型的变量。
为了避免引起误解,一般建议类型的重定义都使用typedef而不是#define。
总结
- typedef用于给类型重定义,可以理解为给类型起了个别名。
- typedef一般这么用:
typedef 原类型名 新类型名;
- 自定义类型尤其喜欢使用typedef,从而达到定义变量时省略struct等关键字的效果。
- 一般类型的重定义都使用typedef,而不是#define,因为#define容易引起误解。
感谢大家的阅读!