Skip to content

LV010-typedef简介

一、什么是 typedef ?

typedef 为 C 语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型( int , char 等)和自定义的数据类型(struct )。

就相当于自己的名字和小名,通过 typedef 为自己的名字定义一个小名,别人叫自己小名的时候也知道叫的是自己。一般来说这个关键字经常在定义结构体类型时使用,毕竟结构体的名字还是有点长的。

二、怎么使用?

1. 基本格式

基本使用格式如下:

c
typedef 原来数据类型 用户自定义数据类型;

【注意】该关键字重新命名数据类型的时候,注意后边加上分号( ; )。

2. 常见用法

2.1 常见类型起别名

c
typedef unsigned long uint32;
uint32 a = 0;
/* 上边两句就等价于 */
unsigned long a = 0;

2.2 结构体类型起别名

一般来说,该关键字多会用在结构体中,例如,

c
typedef struct _node_
{
     int  data;
     struct _node_  *next;
} listnode, *linklist;

这里定义了两个新的数据类型 listnode 和 linklist 。其中 listnode 等价于数据类型 struct _node_ ,而 linklist 等价于 struct _node_ * 。

2.3 数组类型起别名

c
typedef char ARRAY_20[20];

它表示 ARRAY_20 是与类型 char [20] 等价。它是一个长度为 20 的数组类型。接着可以用 ARRAY_20 定义数组,例如

c
ARRAY_20 a1, a2;

/* 等价于 */
char a1[20], a2[20];

2.4 数组指针类型起别名

c
typedef int (*PTR_TO_ARR)[4];

这里定义了一个新的数据类型 PTR_TO_ARR ,它等价于类型 int * [4] ,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针,例如

c
PTR_TO_ARR a1, a2;

下面是一个实例:

c
#include <stdio.h>
typedef char (*PTR_TO_ARR)[30];
char str[3][30] =
{
	"fanhua_0",
	"fanhua_1",
	"fanhua_2",
};
int main()
{
	PTR_TO_ARR parr = str;
	int i;

	for(i=0; i<3; i++)
	{
		printf("str[%d]: %s\n", i, *(parr+i));
	}
	return 0;
}

在终端执行以下命令编译程序:

shell
gcc test.c -Wall # 生成可执行文件 a.out 
./a.out # 执行可执行程序

然后,终端会有以下信息显示:

shell
str[0]: fanhua_0
str[1]: fanhua_1
str[2]: fanhua_2

2.5 函数指针起别名

c
typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC pfunc;

这里定义了一个新的类型 PTR_TO_FUNC ,也就是函数指针类型。

c
#include <stdio.h>
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b)
{
	return a>b ? a : b;
}
int main()
{
	PTR_TO_FUNC pfunc = max;

	printf("max: %d\n", (*pfunc)(5, 6));
	return 0;
}

在终端执行以下命令编译程序:

shell
gcc test.c -Wall # 生成可执行文件 a.out 
./a.out # 执行可执行程序

然后,终端会有以下信息显示:

shell
max: 6