typedef 的讲解与应用实例
- 前言:我们学过C语言的人都应该听过,或者说学过,甚至说用过typedef,多多少少都对其有所了解。不过就算没听过也没关系,我们一起来探讨一下。
- 阐述:typedef 是英文 Type Define 的缩写,中文就是类型定义。在计算机编程语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
- typedef与define的差异:#define在预编译中,只是做简单的完全替换不会做错误检查,不管三七二十一,只会完全替换,例如:#define PI 3.1415926535 你写成3.L415926535,傻傻的编译器还是会把它代入引用的位置。而typedef unsigned int u16;
/*用法一:类型的重定义*/ typedef unsigned char u8; typedef char * PCHAR; ......
这里的第一句是给unsigned char类型重新起个别名,叫 u8 应用时看到u8 定义的变量,就相当于unsigned char 类型,两者是完全等价的。同理第二句是给char *
起了个别名PCHAR ,即 PCHAR 类型代表着指向字符串类型的指针。
1 /*用法二:与结构体结合使用*/ 2 typedef struct tagMyStruct 3 { 4 int iNum; 5 6 long lLength; 7 8 }MyStruct;
这个代码实际上相当于进行了两个操作:
第一声明了一个结构体名为 tagMyStruct
tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和 tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一
个结构类型。
1 struct tagMyStruct 2 { 3 4 int iNum; 5 6 long lLength; 7 8 };
第二给该结构体起了个别名叫 MyStruct
1 typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
当然,我们有时还会看到如下定义:
typedef struct student { char name[N]; int age; char * sex; }std,*pt;
这时是不是感觉有点奇怪,究竟std是结构体的别名,还是*pt是结构体的别名呢?这就是我今天要讲的重点。
上面的代码相当于执行了三步操作:
第一步:定义结构体
struct student { char name[N]; int age; char * sex; }std;
第二步:给结构体重命名
typedef struct student std;
第三步:给结构体指针类型重命名
typedef student struct * pt;
这时,我们可以用pt来声明结构体指针类型的变量了,不用再写 struct student * kk; 直接写 pt kk; 简单明了。
下面给个简单的实例:
1 /* 2 * 程序名称:typedef 的简单实例 3 * 4 * Veis声明。 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define N 20 9 typedef struct student 10 { 11 char name[N]; 12 int age; 13 char * sex; 14 }std,*pt; /*这里的 pt 相当于一个 struct student * 类型;而 std 则是给结构体student起的别名*/ 15 void main() 16 { 17 /*变量声明*/ 18 pt p; /*语句 struct student * p; 与语句 pt p; 等价*/ 19 std st1; 20 21 /*变量初始化*/ 22 strcpy(st1.name,"alen"); 23 st1.age = 15; 24 st1.sex = "male"; 25 p = &st1; 26 27 /*打印输出*/ 28 printf("\t\t\tStudent‘s Informations\nname:%s\nage:%d\nsex:%s\n\n",p->name,p->age,p->sex); 29 }
PS:心动不如行动,看完自己尝试去写,只有去写去思考,你才能更好的理解和掌握一种东西。
本文作者能力有限,若本文有什么讲错的地方欢迎指出,共同进步。-----------------Veis