第11章+结构体、共用体与枚举_第1页
第11章+结构体、共用体与枚举_第2页
第11章+结构体、共用体与枚举_第3页
第11章+结构体、共用体与枚举_第4页
第11章+结构体、共用体与枚举_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子通信与软件工程系2022-6-111第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举主要内容主要内容l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系2022-6-112怎样在程序中描述一本书?结构体类型的概念及定义结构体类型的概念及定义电子通信与软件工程系 图书有书名,作者,价格等信息,我们需要将书名,作者,价格这些信息存放到程序中

2、。可以将二个字符指针(一个用于存储书名的首地址,一个用于存储作者的首地址)和一个double型变量(用于存储价格) 来存储一本书。代码如下: char * bookName; /存储书名 char * bookAuthor;/存储书的作者 double bookPrice; /存储书的价钱 结构体类型的概念及定义结构体类型的概念及定义电子通信与软件工程系 但是,上述代码存在这样一个问题,这三个变量之间互相没有关系,是相互独立的。而实际上它们是有关系的:都是用来描述同一本书的变量!换句话说,这三个变量应该绑定在一起使用,以突出它们组合在一起描述同一本书这个关系。 那么,在C语言中,怎么将变量绑定

3、在一起呢?C语言使用关键字struct来绑定。将这三个变量绑定以后,就形成了一种新的数据类型,而我们就可以使用这种新的类型来描述书这类事物了。 结构体类型的概念及定义结构体类型的概念及定义电子通信与软件工程系 定义结构体类型的语法格式如下: struct 结构体类型的名字 结构体内容; 例如,上述提到的书,使用结构体描述如下: struct Book char *name; /存储书名 char * author;/存储书的作者 double price; /存储书的价钱;结构体类型的概念及定义结构体类型的概念及定义电子通信与软件工程系 这样我们就自定义了一种类型:结构体类型,这个结构体类型的

4、名字为:struct Book,它和系统提供的类型名字,如int,double等一样,都是类型的名字,都可以用来定义变量,区别在于一个是我们自定义的,另一个是系统自带的。 大括号里面的变量都称为结构体的成员,例如:struct Book这个结构体有三个成员,分别是name, author和price。结构体类型的概念及定义结构体类型的概念及定义电子通信与软件工程系2022-6-117第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的

5、指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系结构体类型的变量结构体类型的变量 有了结构体类型以后,我们就可以定义该类型的变量了。例如: structstruct Book Book bookbook; ; 这句代码定义了结构体类型struct Book的一个变量,变量的名字为book。对于结构体变量book,我们可以使用“.”运算符来访问它的成员。例如: =”C language”; book.author=”Tan zhiguo”; book.price = 36.0; 注意

6、:每一个变量都占有相应字节的内存空间,例如,对于 int类型的变量,所占的内存大小为4个字节(假设系统给int类型的变量分配4个字节),而对于结构体变量,其所占的内存是所有成员所占内存的总和。电子通信与软件工程系结构体类型的变量结构体类型的变量 我们也可以在定义结构体变量的同时给其初始化,初始化格式为大括号括起的、用逗号分隔的若干个值指定为成员的新的初始值,例如: struct Book book = “C language”, “Tan zhiguo”, 36.0; 这句代码与上面四句代码完成的功能完全一样。电子通信与软件工程系结构体类型的变量结构体类型的变量【例11-1】结构体变量的定义及

7、使用(chp11_1.c)#include struct Book char * name; char * author; double price;int main() struct Book book; = C language; book.author = Tan zhiguo; book.price = 36; printf(%sn, ); printf(%sn, book.author); printf(%lfn, book.price); return 0;电子通信与软件工程系结构体类型的变量结构体类型的变量 在上述代码中,我们使用结构体类型名

8、struct Book来定义变量 book,这里类型名由struct和Book两个单词组成,当类似这种代码比较多时,书写时将不是很方便. 可以使用关键字typedeftypedef为结构体类型定义等价的类型,用法如下: typedef 已有类型的名称 新类型名字; 例如,typydef int integer; 则以下两句代码: int x; integer x; 等价,也就是说,integer 是类型int的新名字,用integer和int来定义变量没有区别。电子通信与软件工程系结构体类型的变量结构体类型的变量 同样地,我们也可以给struct Book取一个新的等价的名字,例如: stru

9、ct Book char * name; char * author; double price; ; typedef struct Book BOOK; 则BOOK就是新的类型名, struct Book book; 和 BOOK book; 就是两条等价的语句,都用来定义结构体变量book电子通信与软件工程系结构体类型的变量结构体类型的变量 也可以在定义结构体类型的时候,就给其指定一个新的类型名 typedef struct Book char * name; char * author; double price; BOOK; 给结构体类型struct Book指定了等价的类型BOOK。

10、在上述定义中,struct后的单词Book可以省略,例如: typedef struct char * name; char * author; double price; BOOK;其效果跟不省略Book时一样。电子通信与软件工程系2022-6-1114第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体结构体类型的概念及定义类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通

11、信与软件工程系结构体数组结构体数组当存储一本书时,需要用一个结构体变量来存储书的书名、作者以及价格等信息,当程序需要存储多本书时,就需要用到结构体数组了。【例11-2】结构体数组的使用(chp11_2.c) chp11_2.c电子通信与软件工程系结构体数组结构体数组【例11-3】用结构体来描述学生(包括姓名、学号),从键盘输入3个学生的信息,然后按照学生学号从小到大输出学生信息(chp11_3.c) chp11_3.c注意,同类型的结构体变量之间可以相互赋值,例如上述程序中的代码:stusk = stusi。结构体变量 stusi将自己成员的值逐个赋值给stusk对应成员的值,也就是说,结构体

12、变量 stusi的成员name的值赋给了结构体变量stusk的成员name,结构体变量 stusi的成员stuNum的值赋给了结构体变量stusk的成员stuNum。电子通信与软件工程系2022-6-1117第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系结构体指针结构体指针 前面我们学习

13、过指向基本数据类型变量的指针,例如: int x= 3; int * p = &x; p就是指向int类型变量x的指针,现在我们学习了结构体类型,那么指针可以指向结构体变量吗? typedef struct char name20; int stuNum; Student; Student stu;/声明结构体变量stu Student * pStu = &stu; pStu就是指向结构体变量stu的指针,称为结构体指针。注意,结构体指针pStu的值就是结构体变量stu的起始地址,换句话说,当把结构体变量的起始地址赋值给一个指针变量,则指针变量就指向了该结构体变量。电子通信与软件工程系结构体类

14、型的变量结构体类型的变量结构体指针可以通过运算符“-”或者“*.”运算符访问它指向的结构体变量的成员。格式为:指针-结构体变量的成员;(*指针). 结构体变量的成员;【例11-4】通过结构体指针访问结构体变量的成员(chp11_4.c)chp11_4.c 电子通信与软件工程系2022-6-1120第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数

15、l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系指向结构体数组的指针指向结构体数组的指针可以用指针变量指向结构体数组的元素。【例11-5】指向结构体数组的指针(chp11_5.c)#include #define N 3typedefstruct char name20; int stuNum;Student;int main() Student stusN = 张三,123,李四,124,王五,125; Student *pStu; printf(姓名 学号n); for(pStu = stus; pStu name,pStu-stuNum); return 0;电子通信与软件工程系

16、程序分析:程序分析: 在for循环中,指针pStu被赋值为stus, 即指针pStu指向数组stus的第0个元素(pStu = stus+0),循环条件pStu stus +N(N=3)成立,在for循环体中输出第0个元素的信息(“张三”和123),接着,指针pStu执行自增操作,执行自增操作后, pStu = stus+1,pStu就指向了数组stus的第一个元素了,循环条件pStu stus +N依然成立,接着,在for循环体中输出第1个元素的信息(“李四”和124),如此循环。当pStu执行N次自增操作后,pStu的值为 stus+N,循环条件pStu stus +N不再满足,退出for

17、循环。 指向结构体数组的指针指向结构体数组的指针电子通信与软件工程系2022-6-1123第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数 函数的参数除了可以是基本数据类型的变量或指针外,也可以是结构体变量或者结构体指针。如果用结

18、构体变量作为函数的参数,则实参也必须是同类型的结构体变量,调用函数时,实参中成员的值会一一赋值给形参对应的成员。赋完值以后,实参与形参就没有了联系,故形参改变自己成员变量的值不会影响到实参对应成员的值。如果用结构体指针作为函数的参数,实参必须是指向同类型结构体变量的指针。调用函数时,实参将值(其值为所指向的结构体变量的首地址)赋值给形参,这时,实参和形参的值都是某个结构体变量的首地址,故都指向该结构体变量,所以,当形参修改某个成员的值时,实参对应成员的值也跟着改变。【例11-6】结构体变量或指针作为函数的参数(chp11_6.c)chp11_6.c 电子通信与软件工程系2022-6-1125第

19、第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系共用体共用体共用体类型也是程序员自定义的类型,使用关键字union来定义。定义共用体类型的格式如下:union 共用体类型的名字 成员列表;例如:union Data int x; char y;有了共用体类型以后,就可以定义该类型的变量了。例

20、如:union Data data;data就是共用体类型union Data的一个变量。注意,与结构体不同,共用体类型的变量所占的内存空间大小是其成员中所占内存最大的那个成员所占的内存大小,所以data这个共用体变量所占的内存是它的成员x所占的内存大小,即为4个字节(假设int类型变量所占内存为4个字节),成员x和y共享这4个字节的内存空间,这也正是共用体这个名字的由来。所以在使用共用体变量的时候,要注意当前占用内存的是哪一个成员。与结构体一样,也可以使用“.”运算符访问共用体变量的成员。 电子通信与软件工程系结构体类型的变量结构体类型的变量【例11-7】共用体变量的使用(chp11_7.c

21、) #include union Data int x; char y;int main() union Data data; data.x = 353; /256 + 97; printf(“data.x: %dn”, data.x); printf(“data.y: %cn”, data.y);程序分析:共用体变量data的两个成员x和y共享4个字节的存储空间,当执行代码data.x = 353;后,这四个字节在内存中的情况如下所示(十进制353的二进制表示):由于data的成员y是char类型,占用一个字节的内存,所以,这四个字节中最低字节的值被赋给了y,因此,成员y的值为0110000

22、1,转换为十进制的值为97,当以格式%c输出时,输出ASCII表中97所对应的字符a. 00000000000000000000000101100001电子通信与软件工程系2022-6-1128第第1 11 1章章 结构体、共用体与枚举结构体、共用体与枚举l 结构体类型的概念及定义结构体类型的概念及定义l 结构体类型的变量结构体类型的变量l 结构体数组结构体数组l 结构体指针结构体指针l 指向结构体数组的指针指向结构体数组的指针l 结构体变量或指针作为函数的参数结构体变量或指针作为函数的参数l 共用体共用体l 枚举类型枚举类型电子通信与软件工程系枚举类型枚举类型 如果一个变量的取值被限定在几个固定的值中,那么该变量应该声明为枚举类型。所谓“枚举”,就是把所有的值一一列举出来。枚举类型也是自定义类型,定义枚举类型的格式如下: enum 枚举类型的名字常量列表; ; 例如: enum Weekday sun, mon, tus, wed, thu, fri, sat 定义了枚举类型enum Weekday,该类型的变量的取值只限于大括号中的值。大括号中的sun, mon, tus, wed, thu, fri, sat称为枚举常量(枚举常量的命名规则跟标识符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论