• 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("			Student's  Informations
    name:%s
    age:%d
    sex:%s
    
    ",p->name,p->age,p->sex);
    29 }

    PS:心动不如行动,看完自己尝试去写,只有去写去思考,你才能更好的理解和掌握一种东西。

    本文作者能力有限,若本文有什么讲错的地方欢迎指出,共同进步。-----------------Veis

  • 相关阅读:
    非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!
    代码遇到异常怎么办?不要慌,来看看这个!
    老司机要开车了!用Selenium+PhantomJS来抓取煎蛋网妹子图
    Python基础之格式化输出函数format()功能详解
    Python基础之常用格式化输出字符详解
    新手学python,如何才能更快升职加薪,迎娶白富美,走上人生巅峰
    ASP.NET MVC学习笔记 第二天
    ASP.NET MVC学习笔记 第一天
    ActiveMQ相关:
    WPF中使用定时器 DispatcherTimer 做TCP连接中的心跳 HeartBeat
  • 原文地址:https://www.cnblogs.com/veis/p/7127784.html
Copyright © 2020-2023  润新知