前言
在C语言中使用结构体时必须加上struct这个关键字,那有没有办法省略这个呢?要想达到这个目的就 需要用到关键字typedef,顾名思义”类型定义”。 typedef 数据类型 新的别名; 它是用来操作数据类型。其主要作用有两个: 1.给一个较长较复杂的类型取一个简单的别名。 2.给类型取一个和问题相关的别名。 这两种情况在生活中都非常常见,例如第1种情况,中华人民共和国简称中国,第2种情况,你的同学非常 的漂亮给她起个外号叫”大美丽”。 第一种情况的使用如下:
int main()
{
typedef unsigned long long int uint64;//给无符号长长整型取别名叫uint64
//取一个别名 u代表无符号 int代表整形 64代表64位
unsigned long long int a = 10; //定义一个无符号长长整型
uint64 b = 20; //定义一个无符号长长整型
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,在第8行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为函数指针类型,那么它定义的变量就是函数指针变量。 typedef的第二种情况: 给类型取一个和问题相关的别名。这种方式最典型的应用是size_t和time_t这 两种类型。size_t应用在计数方面,time_t应用在时间方面。在visual studio2022中这两者的定义如下:
回到本节提到的问题,如何在使用结构体时省略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;