[2017年整理]C#程序设计 第11章 结构体、联合体与位运算

上传人:豆浆 文档编号:909866 上传时间:2017-05-21 格式:DOC 页数:30 大小:273.50KB
返回 下载 相关 举报
[2017年整理]C#程序设计  第11章  结构体、联合体与位运算_第1页
第1页 / 共30页
[2017年整理]C#程序设计  第11章  结构体、联合体与位运算_第2页
第2页 / 共30页
[2017年整理]C#程序设计  第11章  结构体、联合体与位运算_第3页
第3页 / 共30页
[2017年整理]C#程序设计  第11章  结构体、联合体与位运算_第4页
第4页 / 共30页
[2017年整理]C#程序设计  第11章  结构体、联合体与位运算_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《[2017年整理]C#程序设计 第11章 结构体、联合体与位运算》由会员分享,可在线阅读,更多相关《[2017年整理]C#程序设计 第11章 结构体、联合体与位运算(30页珍藏版)》请在金锄头文库上搜索。

1、1第 11 章 结构体、联合体与位运算本章介绍结构体、联合体及枚举类型等三种新的构造型数据类型以及位运算的基本方法,包括结构体的含义;结构体类型变量的定义、引用及初始化方法;结构体数组的定义和数组元素的引用;结构体类型指针的概念及链表的基本操作方法;联合体的含义;联合体类型变量的定义方法;枚举类型的定义; TYPEDEF 的作用和位运算的基本方法等。11.1 结构体类型通过前面有关章节的学习,我们认识了整型、实型、字符型等 C 语言的基本数据类型,也了解了数组这样一种构造型的数据结构,它可以包含一组同一类型的元素。但仅有这些数据类型是不够的。在实际问题中,有时需要将不同类型的数据组合成一个有机

2、的整体,以便于引用。例如,在新生入学登记表中,一个学生的学号、姓名、性别、年龄、总分等,它们属于同一个处理对象,却又具有不同的数据类型。如图 11-1。每增加、删减或查阅一个学生记录,都需要处理这个学生的学号、姓名、性别、年龄、总分等数据,因此,有必要把一个学生的这些数据定义成一个整体。学 号(整型)姓 名(字符型)性 别(字符型)年 龄(整型)总 分(实型)11301 Zhang Ping F 19 496.5图 11-1虽然数组作为一个整体可用来处理一组相关的数据,但不足的是,一个数组只能按序组织一批相同类型的数据。对于一组不同类型的数据,显然不能用一个数组来存放,因为数组中各元素的类型和

3、长度都必须一致。为了解决这个问题,语言中给出了另一种构造数据类型“结构体” 。 11.1.1 结构体类型与结构体变量结构体是一种构造类型,它由若干“成员”组成。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体既然是一种构造而成的数据类型,那么在使用之前必须先定义它,如同在调用函数之前要先定义或声明一样。定义一个结构体类型的一般形式为:struct 结构体名 成员 1 类型 1;成员 2 类型 2;.成员 n 类型 n;“结构体”这个词是根据英文单词 structure 译出的。结构体中的每个成员均须作类型说明,成员名的命名应符合标识符的书写规定,成员名可以与程序中的变量名同名,二者

4、不2代表同一对象,互不干扰。例如:struct student int num; /* 学号 */char name20; /* 姓名 */char sex; /* 性别 */int age; /* 年龄 */float score; /* 成绩 */;在上述定义中,struct student 是结构体类型名,其中 struct 是关键字,在定义和使用中都不能省略。该结构体由 5 个成员组成。第一个成员为 num,整型变量,当然,在实际应用中我们也常常把学号定义为字符型;第二个成员为 name,字符数组;第三个成员为 sex,字符型;第四个成员为 age,整型;第五个成员为 score,实型

5、变量。应注意末尾的分号是必不可少的。数据类型和变量是两个不同的概念。有了一种结构体类型之后,就可用它去定义变量,就象用 int 去定义一个整型变量那样。定义结构体类型的变量有以下三种方法。1.先定义结构体类型,再定义变量。例如:struct student int num;char name20;char sex;int age;float score;struct student student1,student2;本例中,在定义了 struct student 这个结构体类型之后,再用这个类型标识符去定义了两个结构体变量 student1 与 student2。为了使用方便,也可以在程序开

6、头定义一个符号常量来表示一个结构体类型。例如上例可改写成:#define STU struct student.STU int num;char name20;3char sex;int age;float score;STU student1,student2;2.在定义结构类型的同时定义结构体变量。例如:struct student int num;char name20;char sex;int age;float score; student1,student2;这是一种紧凑形式,既定义了类型,同时又定义了变量。如果需要,下文还可再用struct student 定义其它同类型变量。它

7、的一般形式为:struct 结构体名 成员 1 类型 1;成员 2 类型 2;.成员 n 类型 n;变量名表列;3.直接定义结构体变量。例如:struct int num;char name20;char sex;int age;float score; student1,student2;直接定义了两个结构体变量 student1 与 student2。这种方法省去了结构体名,缺点是若下文再想定义同类型的变量就不便了。上述三种方法中定义的变量 student1 与 student2 都具有下图所示的结构,其所有的4成员都是基本数据类型或数组类型。num name sex age score图

8、 11-2若想将其中的 age 换成出生日期 birthday,定义成含有年份、月份、日期三个子成员的类型,如图 11-3 所示,则需先定义一个 struct date 日期类型,再用它去定义birthday。这就形成了嵌套的结构体。birthdaynum name sexyear month dayScore图 11-3按图可给出以下结构定义:struct date int year;int month;int day;struct student int num;char name20;char sex;struct date birthday;float score; student1,

9、student2;首先定义一个结构体类型 struct date,由 month(月)、day(日)、year(年) 三个成员组成。 再将它用到 struct student 类型的定义中,使其中的成员 birthday 被定义为struct data 类型。类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。11.1.2 结构体变量的引用1.引用结构体变量中的一个成员由于一个结构体变量包含多个成员,要访问其中的一个成员,必须同

10、时给出这个成员所属的变量名以及其中要访问的成员名本身,引用方式为:5结构体变量名.成员名其中的圆点符号称为成员运算符。对成员变量可以象普通变量一样进行各种操作。例如,将学号 11301 赋给 student1 中的 num,应写成以下形式:student1.num=11301;将姓名“ZhangPing”通过键盘赋给 student1 中的 name,应写成:scanf(%s,&student1.name);将 student2 中的 score 加 1,然后输出该值,应写成:student2.score=student2.score+1; 或 student2.score+;printf(%

11、f,student2.score);成员运算符的运算级别最高,例如:student.num+100,在 num 两侧有二个运算符,由于成员运算符的运算优先于加号运算符,故相当于(student.num)+1002.成员本身又是结构体类型时的子成员的访问如果成员本身又是一种结构体类型时,那么对其下级子成员再通过成员运算符去访问,一级一级地直到最后一级成员为止。例如上文提到的 birthday,可以这样去访问:student1.numstudent1.birthday.yearstudent1.birthday.monthstudent1.birthday.daystudent1.score这里,

12、student1.birthday 本身相当于一个结构体变量。注意下述用法是错误的:year /*少了上两级所属主体*/birthday.year /*少了结构体变量主体*/student1.year /*不能跨级访问*/year.birthday.student1 /*不能颠倒次序*/3.同一种类型的结构体变量之间可直接赋值一般地,可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。例如:student2=student1;student1 与 student2 两者类型相同,上述赋值语句相当于将 student1 中各个成员的值逐个依次赋给 student2 中的相应成员。

13、若两者的类型不一致时,则不能直接赋值。通常,也可以把一个结构体变量中的内嵌结构体类型成员赋给同种类型的另一个结构体变量的相应部分。如下列语句是合法的:6student2.birthday=student1.birthday;4.不允许将一个结构体变量作为一个整体进行输入或输出下述用法是错误的:scanf(%d,%s,%c,%d,%f,&student1); /*错*/printf( %d,student1); /*错*/printf(%d,%s,%c,%d,%f,student1); /*错*/5.一个结构体变量所占用的存储空间就是其所有成员所占空间之和。11.1.3 结构体变量的初始化与其他

14、类型变量一样,对结构体变量也可以在定义时进行初始化赋值,但附在变量后面的一组数据须用花括号括起来,其顺序应与结构体中的成员顺序保持一致。【例 11-1】对结构体变量初始化。main() struct student int num;char name20;char sex;int age;float score; student1 =11301,Zhang Ping,F,19,496.5;printf(Number=%dnName=%sn,student1.num,student1.name);printf(Score=%fn,student1.score);运行结果如下:Number=113

15、01Name=Zhang PingScore=496.500000本例中,student1 在被定义的同时,其各成员也按顺序被赋予了相应的一组数据。11.2 结构体数组一个结构体变量只能存放一个对象(如一个学生、一个职工)的一组数据。如果要存放一个班(30 人)学生的有关数据就要设 30 个结构体变量,例如student1,student2,student30,显然是不方便的。人们自然想到使用数组。C 语言允许使用结构体数组,即数组中每一个元素都是一个结构体变量。11.2.1 结构体数组的定义定义结构体数组的方法与定义结构体变量方法相似,只是要多用一个方括弧以说明它7是个数组。在上一节中定义结

16、构体变量的三种方法可以作为定义结构体数组的参考。如:struct student int num;char name20;char sex;int age;float score; student1,stu30;以上定义了一个结构体变量 student1 和一个结构体数组 stu,这个数组有 30 个元素,每一个元素都是 struct student 类型的,如图 11-4 所示。数组各元素在内存中占用连续的一段存储单元。num name sex age scorestu0 11301 Zhang Ping F 19 496.5stu1 11302 Wang Li F 20 483 stu29 11330 Mao Qiang M 18 502图

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号