你知道C语言的typedef关键字吗?

本篇博客主要讲解C语言中的typedef关键字。typedef的作用是类型重定义,可以理解为给类型起一个别名。我主要从3个方面来讲解:

  1. typedef内置类型。
  2. typedef自定义类型。
  3. typedef和#define的区别。

你知道C语言的typedef关键字吗?_第1张图片

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。

总结

  1. typedef用于给类型重定义,可以理解为给类型起了个别名。
  2. typedef一般这么用:typedef 原类型名 新类型名;
  3. 自定义类型尤其喜欢使用typedef,从而达到定义变量时省略struct等关键字的效果。
  4. 一般类型的重定义都使用typedef,而不是#define,因为#define容易引起误解。

感谢大家的阅读!

你可能感兴趣的:(C语言,c语言,c++,关键字,开发语言,链表)