目录
1.定义
在
C
语言中使用结构体时必须加上
struct
这个关键字
,
那有没有办法省略这个呢
?
要想达到这个目的就
需要用到关键字
typedef,
顾名思义
”
类型定义
”
。
结构:typedef
数据类型 新的别名
;
2.使用场景
(1)
给一个较长较复杂的类型取一个简单的别名。
(2)
给类型取一个和问题相关的别名。
这两种情况在生活中都非常常见
,
例如第
1
种情况
,
中华人民共和国简称中国
,
第
2
种情况
,
你的同学非常
的漂亮给她起个外号叫
”
大美丽
”
。
2.1 情况1
第一种情况的使用如下
:
typedef unsigned long long int uint64;//给无符号长长整型取别名叫uint64
int main()
{
unsigned long long int a = 1000;//定义一个无符号长长整型变量
uint64 b = 2000; //定义一个无符号长长整型变量
uint64* p = &b;
p = &a; //a和b的类型完全相同
return 0;
}
上面的代码给
unsigned long long int
数据类型取了一个简单的别名
uint64,
其中
u
表示符号
,int
表示
整数
,64
表示
64
位。
typedef unsigned long long int uint64;//给无符号长长整型取别名叫uint64
typedef int* Pint;//给整型指针int * 取别名叫Pint
typedef int Arr[10];//这是什么呢?
typedef int (*Pfun)(int, int);//这是什么呢?
int main()
{
int a = 10;
Pint p = &a;
printf("%d\n", sizeof(Arr));
return 0;
}
第
2
行代码给
int*
类型取了一个别名
Pint,
在第
9
行
Pint
定义的变量就是
int*
这种数据类型了。
对于比较复杂的类型如
3,4
行就不容易理解了。那怎么办呢
?
关键是牢记
typedef
是用来定义数据类型
的。
对于复杂的类型可以先把
typedef
去掉
,
看看是定义一个什么类型的变量
,
然后加上
typedef
它就由这种
类型的变量提升为这种数据类型。
利用typedef定义的新类型使用如下:
typedef int* Pint;//给整型指针int * 取别名叫Pint
typedef int Arr[10];//Arr为整数数组类型
typedef int (*Pfun)(int, int);//Pfun为函数指针类型
int Max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a = 10;
Pint p = &a; //p为指针变量
Arr arr = { 1,2,3,4,5,6,7,8,9,10 };//arr为数组
Pfun pf = Max;//pf为函数指针变量
printf("%d\n", pf(10, 20));
return 0;
}
第
13
行
,Pint
为整型指针类型
,
那么它定义的变量就是整型指针变量。
第
15
行
,Arr
为整型数组类型
,
那么它定义的变量就是整型数组变量。
第
17
行
,Pfun
为函数指针类型
,
那么它定义的变量就是函数指针变量。
2.2 情况2
typedef
的第二种情况
:
给类型取一个和问题相关的别名。这种方式最典型的应用是
size_t
和
time_t
这两种类型。size_t
应用在计数方面
,time_t
应用在时间方面。在
visual studio2022
中这两者的定义如下
:
2.3 在结构体中的应用
回到本节提到的问题
,
如何在使用结构体时省略
struct
这个关键字呢
?
可以按照如下方法定义结构体。
例如
:
//第一个方式
struct A
{
int a;
char b;
};
typedef struct A A;//给struct A起个别名叫A
//第二种方式
typedef struct B
{
char a;
int b;
}B; //给struct B起个别名叫B
int main()
{
A aa = { 10,'x' }; //直接使用A
B bb = { 'y',20 }; //直接使用B
return 0;
}
typedef struct Node {
int data;
struct Node* next;
}Node,*List;//List==Node*
//typedef struct Node* List;