zoukankan      html  css  js  c++  java
  • 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这样的方法,特别是后者,用的很多,但是不做说明,非常容易搞糊涂的。好了,到此为止吧。

     

  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/11737684.html
Copyright © 2011-2022 走看看