• C语言应用--数据类型定制一定义和引用


      目前,定制正在变的越来越普遍,定制服务、定制衣服、甚至使用的键盘都是定制了。在C语言中虽然也包括了整型、字符型和浮点型等基本类型,也有基本的组合数据类型数组。但是这些类型都是针对某一种特定类型时应用没有问题,但是类型本身严格限定了数据的存储特征、取值范围、能够进行的操作等方面。但是在面对复杂多变的世界时,有些数据只用基本数据表示,使用将边的异常复杂;甚至有的时候只是借助基本类型都无法表示有些数据,因此数据的多样性就非常有必要了。多样的主要途径就是数据类型定制,C语言中数据定制的基础包括:指针、结构体、位段、联合体、枚举和关键字typedef,通过将这些东东进行简单的组合实现数据的类型定义。

      一、结构体概念和干年:

      1、主要针对需要较多种类的数据才能表示的数据,采用结构体表示会非常方便,例如需要表示在校生的学号、姓名、年龄、性别、成绩、其他等信息时数据类型规划如下:

      学号   long

      姓名   char[]

      年龄   int

      性别   boolj

      成绩    float

      很明显看出,无论是采用那种基本的数据类型都无法完整的表示学生的信息。采用自定义数据类型就成了唯一的选择,采用结构体数据类型才能把这些数据有效的组织在一起。

      2、结构体的关键字:struct,常见的教材中的声明方式为结构体关键字struct,结构体的标签stu,结构体的成员声明long sNo;   char sName[30];  int sAge;  bool sSex;  float sScore;等,可以包括其他的自定义类型的数据,所有的成员放置到一对大括号{}中,括号后面必须有“;”表明结构体声明的结束,在此直接接一个结构体的变量名,这是第一种结构体变量声明的方法:  

    1 struct stu{
    2     long sNo;
    3     char sName[30];
    4     int sAge;
    5     bool sSex;
    6     float sScore;
    7 } stu1; 

      初始化的方法为:

    1    stu1.sNo = 0001;                                                                                                            
    2     //stu1.sName = "zhangsan";
    3     strcpy(stu1.sName, "zhangsan");
    4     stu1.sAge = 20; 
    5     stu1.sSex = true;
    6     stu1.sScore = 78.5;

      输出方法很简单:

    1 printf("%s's info: sNo--%d	 sAge--%d	 sSex--%d	 sScore--%f
    ", stu1.sName, stu1.sNo, stu1.sAge, stu1.sSex, stu1.sScore);

      应该没有任何问题,但是存在一个问题就是,在定义结构体的同时进行结构体变量的定义,另外的结构体变量声明方法,若想再次定义,必须使用struct stu stu2之类的方式定义

    1    struct stu stu2;
    2 
    3     stu2.sNo = 0002;
    4     strcpy(stu2.sName, "lisi");
    5     stu2.sAge = 21;
    6     stu2.sSex = true;
    7     stu2.sScore = 80.8;                                                                                                         
    8 
    9     printf("%s's info: sNo--%d	 sAge--%d	 sSex--%d	 sScore--%f
    ", stu2.sName, stu2.sNo, stu2.sAge, stu2.sSex, stu2.sScore);

      整个的结果是:

    1 zhangsan's info: sNo--1  sAge--20        sSex--1         sScore--78.500000
    2 lisi's info: sNo--2      sAge--21        sSex--1         sScore--80.800003

      说明:1、结构体类型声明必须有struct关键字,后又数据类型名

        2、定义体现了用户使用的自主性,可以有不同的数据组合

        3、结构体所有成员,包含类型和名称,必须包含在大括号中,成员可以为基本类型和自定义类型(结构体、枚举、联合体、指针、数组等),甚至可以为结构体自身,结构体定义可以嵌套

        4、结构体成员内部之间不允许有重名,但是可以和其他的结构体成员名称一样,结构体成员在结构体的命名空间中

        5、结构体的声明只能告诉编译器结构体的特征,以及使用时的数据特征,必须等结构体变量完成初始化后,才有内存分配

        6、结构体定义一般作为全剧变量,放置到所有函数的外部,或者放置到实现文件的外部,放置到头文件中

        7、结构体一旦定义之后,可以和普通类型一样使用,可以定义结构体数组,结构体变量,结构体指针,甚至,可以让函数传递和返回结构体变量

        8、结构体在分配内存时,存在着内存对齐的情况,最好不要人工计算结构体的内存大小,直接使用sizeof(struct stu)可以获取我们定义的结构体的大小 

      其实我们也可以先定义结构体,在使用struct stu stu2这样的方法来定义结构体变量。

      在定义结构体的同时,声明结构体的变量时,可以定义匿名结构体,但是,必须在声明的同时,声明结构体的变量。

     1 struct {
     2     long sNo;
     3     char sName[30];
     4     int sAge;
     5     bool sSex;
     6     float sScore;
     7 } stu3;
     8 
     9    stu3.sNo = 0003;
    10     strcpy(stu3.sName, "wangwu");
    11     stu3.sAge = 23;
    12     stu3.sSex = true;
    13     stu3.sScore = 83.10;
    14 
    15     printf("%s's info: sNo--%d	 sAge--%d	 sSex--%d	 sScore--%f
    ", stu3.sName, stu3.sNo, stu3.sAge, stu3.sSex, stu3.sScore);
    1 zhangsan's info: sNo--1  sAge--20        sSex--1         sScore--78.500000
    2 lisi's info: sNo--2      sAge--21        sSex--1         sScore--80.800003
    3 wangwu's info: sNo--3    sAge--23        sSex--1         sScore--83.099998

      由此可见,实际上,有名和无名结构体使用时一样的,不一样的就是再次定义时,特别有结构体嵌套时,更加明显。

     1 typedef struct _stu{
     2     long sNo;
     3     char sName[30];
     4     int sAge;
     5     bool sSex;
     6     float sScore;
     7 } Student;
     8 
     9 Student stu4;
    10     
    11     stu4.sNo = 0004;
    12     strcpy(stu4.sName, "zhaoliu");
    13     stu4.sAge = 24;
    14     stu4.sSex = true;
    15     stu4.sScore = 90.16;
    16 
    17     printf("%s's info: sNo--%d	 sAge--%d	 sSex--%d	 sScore--%f
    ", stu4.sName, stu4.sNo, stu4.sAge, stu4.sSex, stu4.sScore);

      执行结果:

    1 zhangsan's info: sNo--1  sAge--20        sSex--1         sScore--78.500000
    2 lisi's info: sNo--2      sAge--21        sSex--1         sScore--80.800003
    3 wangwu's info: sNo--3    sAge--23        sSex--1         sScore--83.099998
    4 zhaoliu's info: sNo--4   sAge--24        sSex--1         sScore--90.160004

      这种定义使用时更加的连贯和流畅。

    二、结构体的引用和成员的引用

      结构体的应用和普通变量的引用完全一样,但是对结构体变量的赋值,实际上是对结构体变量的成员变量赋值操作的过程,注意方式方法。

      结构体变量成员的引用,需要使用成员访问符号“.”,方法就是stu4.sName访问结构头体变量stu4中的成员变量sName的值,一切so easy!

      但是一旦面对结构体指针变量时,就有两种方法(*ptrStu4).sName访问结构体指针变量ptrStu4中的成员变量sName的值,也可以使用ptrStu4->sName这样的方法,特别是后者,用的很多,但是不做说明,非常容易搞糊涂的。好了,到此为止吧。

     

  • 相关阅读:
    根据用户输入的时间查询那天的数据
    动软 生成 linq相关DAO
    pdf 移除密码 去除水印 批量去除水印 编辑文字 批量替换文字
    利用OCR识别扫描的jpg、tif文件的文字
    jstat命令详解
    IDEA自动编译设置
    IntelliJ IDEA:Field injection is not recommended
    阿里巴巴Druid数据库连接池配置详解及使用
    com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别
    Java对元与分的金额的转换
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/11737684.html
Copyright © 2020-2023  润新知