欢迎来到我的博客https://www.cnblogs.com/veis/

https://www.cnblogs.com/veis/p/14182037.html

C语言中的typedef

typedef 的讲解与应用实例

  •   前言:我们学过C语言的人都应该听过,或者说学过,甚至说用过typedef,多多少少都对其有所了解。不过就算没听过也没关系,我们一起来探讨一下。
  •   阐述:typedef 是英文 Type Define 的缩写,中文就是类型定义。在计算机编程语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与autoexternmutablestaticregister等关键字不能出现在同一个表达式中。
  •   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

 

posted @ 2017-07-06 18:14  veis  阅读(631)  评论(0编辑  收藏  举报