标准C程序设计(五)

来源:互联网 发布:视频点播数据分析报告 编辑:程序博客网 时间:2024/04/27 20:18
10 结构体与共用体
   10.1 结构体的定义
   数组可以用来表示一组相同类型的数据项。但是,如果要用一个名称来表示不同类型的数据集合,就不能用数组了。C语言支持一种结构化的数据类型,称为结构体。它是一种封装不同类型的数据的机制。结构体的概念类似于其他很多语言中“记录”。
   与数组不同,必须首先定义结构体的格式,然后在声明结构体的变量。结构体定义和结构体变量创建过程。如下:
   struct book_bank{     char title[20];     char author[15];     int pages;     float price;};
   关键字struct声明一个结构体,该结构体有4个数据字段(即title、author、pages和price)。这些字段称为结构体元素或成员,每个成员可以属于不同的数据类型。book_bank是结构体名,称为结构体标记符。随后就可用标记符名来生命属于该结构体的变量。
    注意,上面的定义中没有声明任何变量,只是描述了一种称为模板的格式。
     定义一个结构体时应注意以下语法:
  • 结构体模板以分号结束
  • 整个定义被看做是一条语句,而每个成员则以自己的名称和类型分别声明在模板中的单个语句
  • 诸如book_bank的标记符名可在后面的程序中用于声明结构体变量
数组与结构体区别与联系:它们都属于结构化数据类型,都提供了一种相对简单的方式来访问和操作数据。
  • 数组是相同类型的数据元素的集合。而结构体可以有不同类型的元素
  • 数组其实是一个派生的数据类型,而结构体是一种程序员自定义的数据类型
  • 数组就像是C语言内置的一种数据类型。我们所要做的就是声明一个数组变量,然后就可以直接使用了。但结构体不同,我们首先的设计并声明一个数据结构,然后才能声明和使用这种类型的变量。
     10.2 声明结构体变量
     结构体变量的声明包括以下部分:关键字struct,结构体标记符,由逗号分隔开的变量名列表,终止分号。如:
     struct book_bank book1, book2;
     其中,结构体的成员本身不是变量,他们不占用任何存储空间,除非它们与诸如book1之类的结构体变量相关联。当编译器遇到声明语句时,将为结构体变量保留存储空间。也可以将结构体定义与变量声明组合在一条语句之中。
 struct book_bank{     char title[20];     char author[15];     int pages;     float price;} book1, book2;
     这里的标记符名(book_bank)可要可不要。但是,并不推荐使用这种方法,原因:
  • 由于没有标记符名,就不能再用它来声明其他变量了;
  • 通常,结构体定义是出现在程序文件的开头,位于所有变量或函数定义之前。也可以出现在main和诸如#define之类的宏定义之前。在这些情况下,结构体定义是全局,可以被其他函数使用。
   也可使用关键字typedef来定义结构体
typedef用法详解:http://www.kuqin.com/language/20090406/44443.html
typedef struct{     char title[20];     char author[15];     int pages;     float price;} mybook;
mybook表示给一个已经存在的数据类型一个新名字,用来简化变量声明。如可以声明变量mybook book1, book2;
    10.3 结构体的初始化
 C语言不允许对模板中的单个结构体成员进行初始化,必须在实际结构体变量的声明中初始化。test_38.c
    10.4 共用体
 共用体是从结构体中借来的概念,因此遵循与结构体相似的语法。共用体与结构体两者之间主要的区别是存储形式。 
 在结构体中,每个成员有自己的存储空间,而共用体中的所有成员使用相同的存储空间。这意味着,尽管共用体可以含有不同的数据类型的多次成员,但一次只能处理一个成员。共用体声明如下:
union item{     int m;     float x;     char c;} code;
   访问一个共用体成员,可以使用访问结构体成员相同的语法。即code.m。访问时,必须确保当前存储是我们要访问的成员的值。如以下语句将产生输出错误:
    code.m = 379;code.x = 324.43;printf("%d\n", code.m );
共用体只创建一个存储空间,每次只能被某一成员使用。当某一成员被赋予一个新值时,该新值将替代掉前一成员的值。
     当声明变量时,可以对共用体进行初始化。但是,与结构体不同的是,只能用与第一个共用体成员的类型相同的值进行初始化。如unio item code = {100};是合法的,但是,union item code = {10.23};是非法的
    10.5 结构体与共用体存储

0 0
原创粉丝点击