在C语言中,有一个关键字叫做typedef,有些人对此感到很疑惑。不熟悉此知识的同学都会对编程失去细心,直接劝退(因为之前我就是这样)。、
因为好不容易认识了C语言中所有的关键字(就是类型吧,像啥int,char,long,int arr[],char*等等等),但是有时候却出现了Student a,TreeTypeData node之类的语句,这些语句一看就令人头皮发麻。
Student a;
TreeTypeData node;
还有那些我们复制粘贴的代码,但是一运行就报99个错误就崩溃了。
明明有主函数,但是确实TreeTypeData这种类型也确实没见过,于是大家看见报错,就感觉好难,为什么?算了,就这样吧,不学了。
好吧,不得不说,这种总是给出部分代码的文章,确实很容易让新手退坑,其实在C语言中,也确实没有这种类型,但是此时我们的主角就登场了,他们都是通过使用typedef来重命名的。
typedef关键字,其实是重命名关键字,相当于我们给类型起了一个别名,比如:
typedef int A;
//此时我们将int类型起了别名 A
int main()
{
//定义一个int变量a
int a = 0;
//使用 int 别名定义一个变量 b
A b = 0;
return 0;
}
就好像此时有一个人叫int,我们给他起了一别名叫 A 。
所以此时你喊他int他会答应,喊他A他也会答应。所以以上代码相当于定义了两个整形,一个整形变量a,一个整形变量b。我们可以观察a、b的大小来验证,他们都是同一种类型,是整形,所以占4字节空间。我们改变它并打印:
typedef int A;
//此时我们将int类型起了别名 A
int main()
{
//定义一个int变量a
int a = 0;
//使用 int 别名定义一个变量 b
A b = 0;
a = 1;
b = 3;
printf("a = %d, b = %d\n", a, b);
printf("a的大小为:%d\n", sizeof(a));
printf("b的大小为:%d\n", sizeof(b));
return 0;
}
起别名目的并不是为了提高程序运行效率,而是为了编码方便,提高代码的可读性,令人见名思意。
之后就是typedef对结构体的使用了,这也是令人头疼的地方。我们知道结构体是由成员列表的(详情请看:结构体和位段-CSDN博客)。
其实变量列表我们一般不会使用,大部分还是给结构体起别名。
typedef struct N
{
int a;
}Node;
此时我们给结构体struct N 起了Node的别名。
typedef struct N
{
int a;
}Node;
int main()
{
Node num1 = { 2 };
//利用别名定义一个结构体变量
struct N num2 = { 3 };
printf("%d\n", num1.a);
printf("%d\n", num2.a);
return 0;
}
所以下次看到没有见过的关键字,大家就知道其实在此之前就已经重命名了。