《(中职)c语言技能教程第10章课件.ppt》由会员分享,可在线阅读,更多相关《(中职)c语言技能教程第10章课件.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、(中职)c语言技能教程第10章ppt课件C语言教程第第1010章章 类型类型 DIY DIY结构体和共用体结构体和共用体C语言教程第第1010章章10.110.1技能技能1 1:在程序中使用结构体类型:在程序中使用结构体类型10.210.2技能技能2 2:在程序中使用共用体类型:在程序中使用共用体类型 C语言教程【概要概要】在程序设计中,把一些关系密切而数据类型不在程序设计中,把一些关系密切而数据类型不同的数据组织在一起,并为其命名一个名字,这同的数据组织在一起,并为其命名一个名字,这类数据称为结构体。共用体是一种类似于结构体类数据称为结构体。共用体是一种类似于结构体的构造型数据类型,它准许不
2、同类型和不同长度的构造型数据类型,它准许不同类型和不同长度的数据共享同一块存储空间。的数据共享同一块存储空间。它们都是它们都是“构造构造”而成的数据类型而成的数据类型,在说明和在说明和使用之前必须先定义,也就是类型使用之前必须先定义,也就是类型 DIY DIY。第第10章章 类型类型 DIY结构体和共用体结构体和共用体C语言教程10.1 10.1 技能技能1 110.1.1 10.1.1 结构体结构体结构体结构体(即即即即“结构结构结构结构”)”)的概念的概念的概念的概念 在日常生活中,常会遇到一些需要填写的登记表,如住在日常生活中,常会遇到一些需要填写的登记表,如住在日常生活中,常会遇到一些
3、需要填写的登记表,如住在日常生活中,常会遇到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。在这些表中,填写的数据是不宿表、成绩表、通讯地址等。在这些表中,填写的数据是不宿表、成绩表、通讯地址等。在这些表中,填写的数据是不宿表、成绩表、通讯地址等。在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中通常会登记上姓名、能用同一种数据类型描述的,在住宿表中通常会登记上姓名、能用同一种数据类型描述的,在住宿表中通常会登记上姓名、能用同一种数据类型描述的,在住宿表中通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名
4、、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、邮编、邮箱地址、电话号码、邮编、邮箱地址、电话号码、邮编、邮箱地址、电话号码、E-mailE-mail等项目。这些表中集合等项目。这些表中集合等项目。这些表中集合等项目。这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,了各种数据,无法用前面学过的任一种数据类型完全描述,了各种数据,无法用前面学过的任一种数据类型完全描述,了各种数据,无法用前面学过的任一种数据类型完全描述,因此因此因此因此C C引入一种能集中不同数据类型于一体的数据类型引入一种能
5、集中不同数据类型于一体的数据类型引入一种能集中不同数据类型于一体的数据类型引入一种能集中不同数据类型于一体的数据类型结构结构结构结构体类型。结构体类型的变量可以拥有不同数据类型的成员,体类型。结构体类型的变量可以拥有不同数据类型的成员,体类型。结构体类型的变量可以拥有不同数据类型的成员,体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。是不同数据类型成员的集合。是不同数据类型成员的集合。是不同数据类型成员的集合。结构体结构体结构体结构体:是将若干个类型相同或不同的数据组合成一个有是将若干个类型相同或不同的数据组合成一个有是将若干个类型相同或不同的数据组合成一个有是将
6、若干个类型相同或不同的数据组合成一个有机的集合。机的集合。机的集合。机的集合。“结构体结构体结构体结构体”是一种构造类型,它是由若干是一种构造类型,它是由若干是一种构造类型,它是由若干是一种构造类型,它是由若干“成员成员成员成员”组成的。每一个成员可以是一个基本数据类型或者又是一组成的。每一个成员可以是一个基本数据类型或者又是一组成的。每一个成员可以是一个基本数据类型或者又是一组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体既是一种个构造类型。结构体既是一种个构造类型。结构体既是一种个构造类型。结构体既是一种“构造构造构造构造”而成的数据类型而成的数据类型而成的数据类型而成
7、的数据类型,那么那么那么那么在说明和使用之前必须先定义它,也就是构造它。如同在说在说明和使用之前必须先定义它,也就是构造它。如同在说在说明和使用之前必须先定义它,也就是构造它。如同在说在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。明和调用函数之前要先定义函数一样。明和调用函数之前要先定义函数一样。明和调用函数之前要先定义函数一样。C语言教程10.1.2 结构体类型的定义【引例】【引例】住宿表、成绩表、通讯地址表用住宿表、成绩表、通讯地址表用住宿表、成绩表、通讯地址表用住宿表、成绩表、通讯地址表用C C提供的结构提供的结构提供的结构提供的结构体类型描述如下
8、:体类型描述如下:体类型描述如下:体类型描述如下:成绩表成绩表成绩表成绩表:struct score struct score char grade20;/*char grade20;/*班级班级班级班级*/*/long number;/*long number;/*学号学号学号学号*/*/char name20;/*char name20;/*姓名姓名姓名姓名*/*/float os;/*float os;/*操作系统操作系统操作系统操作系统*/*/float datastru;/*float datastru;/*数据结构数据结构数据结构数据结构*/*/float compnet;/*fl
9、oat compnet;/*计算机网络计算机网络计算机网络计算机网络*/*/;C语言教程 这一系列对不同登记表的数据结构的描这一系列对不同登记表的数据结构的描述类型称为结构体类型。由于不同的问题述类型称为结构体类型。由于不同的问题有不同的数据成员,也就是说有不同描述有不同的数据成员,也就是说有不同描述的结构体类型。也可以理解为结构体类型的结构体类型。也可以理解为结构体类型根据所针对的问题其成员是不同的,可以根据所针对的问题其成员是不同的,可以有任意多的结构体类型描述。有任意多的结构体类型描述。C语言教程【知识点】【知识点】1.定义结构体类型的一般格式为:struct 结构体名结构体名类型类型
10、结构成员名结构成员名类型类型 结构成员名结构成员名;C语言教程【知识点】【知识点】2.结构体名:由用户命名,是类型的标识符而不是变量结构体名:由用户命名,是类型的标识符而不是变量结构体名:由用户命名,是类型的标识符而不是变量结构体名:由用户命名,是类型的标识符而不是变量 名。也可以省略结构体名。名。也可以省略结构体名。名。也可以省略结构体名。名。也可以省略结构体名。3.3.结构体成员结构体成员结构体成员结构体成员:构成结构体的每一个类型变量称为结构体构成结构体的每一个类型变量称为结构体构成结构体的每一个类型变量称为结构体构成结构体的每一个类型变量称为结构体成员。成员。成员。成员。它象数组的元素
11、一样它象数组的元素一样它象数组的元素一样它象数组的元素一样,但数组中元素是以下标但数组中元素是以下标但数组中元素是以下标但数组中元素是以下标来访问的来访问的来访问的来访问的,而结构而结构而结构而结构 体是按变量名字来访问成员的。体是按变量名字来访问成员的。体是按变量名字来访问成员的。体是按变量名字来访问成员的。4.4.结构体成员名的命名规则与变量相同,并且允许与变结构体成员名的命名规则与变量相同,并且允许与变结构体成员名的命名规则与变量相同,并且允许与变结构体成员名的命名规则与变量相同,并且允许与变量或其他结构体中的成员重名。量或其他结构体中的成员重名。量或其他结构体中的成员重名。量或其他结构
12、体中的成员重名。5.5.结构体成员可以是简单类型、数组、指针或已说明过结构体成员可以是简单类型、数组、指针或已说明过结构体成员可以是简单类型、数组、指针或已说明过结构体成员可以是简单类型、数组、指针或已说明过的结构体等。的结构体等。的结构体等。的结构体等。6.6.大括号外边的分号不可省略。大括号外边的分号不可省略。大括号外边的分号不可省略。大括号外边的分号不可省略。C语言教程【典型例题】【典型例题】例例例例10.1 10.1 定义一个反映学生基本情况的的结构类定义一个反映学生基本情况的的结构类定义一个反映学生基本情况的的结构类定义一个反映学生基本情况的的结构类型,用以存储学生的学号、姓名、性别
13、、成绩。型,用以存储学生的学号、姓名、性别、成绩。型,用以存储学生的学号、姓名、性别、成绩。型,用以存储学生的学号、姓名、性别、成绩。struct stustruct stu int num;int num;char name20;char name20;char sex;char sex;float score;float score;C语言教程10.1.3 结构体变量的定义、初始化和引用一、一、结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义与其它类型的变量的定义是结构体类型变量的定义与其它类型的变量的定义是结构体类型变量的定义与其它类型的变量的定义是结构体类型变量的定义与其它
14、类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定一样的,但由于结构体类型需要针对问题事先自行定一样的,但由于结构体类型需要针对问题事先自行定一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,义,所以结构体类型变量的定义形式就增加了灵活性,义,所以结构体类型变量的定义形式就增加了灵活性,义,所以结构体类型变量的定义形式就增加了灵活性,共有三种形式。共有三种形式。共有三种形式。共有三种形式。C语言教程【知识点】【知识点】定义结构体变量的三种方法。定义结构体变量的三种方法。定义结构体变量的三种方法。定义结构体变量的三种方法。1.1.先定义结
15、构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。2.2.在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。3.3.直接定义结构体变量。直接定义结构体变量。直接定义结构体变量。直接定义结构体变量。C语言教程【典型例题】【典型例题】【典型例题】【典型例题】例例例例10.2 10.2 结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。(1 1)先定义结构体类型,再定义结构体)
16、先定义结构体类型,再定义结构体)先定义结构体类型,再定义结构体)先定义结构体类型,再定义结构体类型变量:类型变量:类型变量:类型变量:struct stu /*struct stu /*定义结构体类型定义结构体类型定义结构体类型定义结构体类型*/*/int num;int num;char name20;char name20;char sex;char sex;float score;float score;struct stu b1,b2;/*struct stu b1,b2;/*定义结构体变量定义结构体变量定义结构体变量定义结构体变量*/*/C语言教程【典型例题】【典型例题】【典型例题】
17、【典型例题】例例例例10.2 10.2 结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。(2 2)定义结构体类型同时定义结构体类)定义结构体类型同时定义结构体类)定义结构体类型同时定义结构体类)定义结构体类型同时定义结构体类型变量:型变量:型变量:型变量:struct stustruct stuint num;int num;char name20;char name20;char sex;char sex;float score;float score;b1,b2;/*b1,b2b1,b2;/*b1,b2为结构体变量为结构体变量为结构体变量为结构体变量
18、*/*/定义定义定义定义stustu为结构体类型的同时定义了两个结构为结构体类型的同时定义了两个结构为结构体类型的同时定义了两个结构为结构体类型的同时定义了两个结构体变量体变量体变量体变量b1,b2b1,b2。C语言教程【典型例题】【典型例题】例例例例10.2 10.2 结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。结构体变量的定义方法。(3 3)直接定义结构体类型变量:)直接定义结构体类型变量:)直接定义结构体类型变量:)直接定义结构体类型变量:structstructint num;int num;char name20;char name20;char sex;cha
19、r sex;float score;float score;b1,b2;b1,b2;C语言教程该法由于无法记录该结构体类型,所以除直接定义外,不能再定义该该法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。结构体类型变量。第(第(3 3)种方法与第()种方法与第(2 2)种方法的区别在于第三种方法中省去了结构)种方法的区别在于第三种方法中省去了结构体名,直接给出结构体变量。三种方法中说明的体名,直接给出结构体变量。三种方法中说明的b1,b2b1,b2变量都具相同的结构。变量都具相同的结构。说明了说明了b1,b2b1,b2变量为变量为stustu类型后,即可向这两个变量中
20、的各个成员赋值。类型后,即可向这两个变量中的各个成员赋值。在上述在上述stustu结构定义中,所有的成员都是基本数据类型或数组类型。结构定义中,所有的成员都是基本数据类型或数组类型。(4 4)成员也可以又是一个结构体类型,即构成了嵌套的结构。)成员也可以又是一个结构体类型,即构成了嵌套的结构。如:如:struct datestruct dateint month;int month;int day;int day;int year;int year;struct int num;struct int num;char name20;char name20;char sex;char sex;s
21、truct date birthday;struct date birthday;float score;float score;b1,b2;b1,b2;首先定义一个结构类型首先定义一个结构类型datedate,由,由month(month(月月)、day(day(日日)、year(year(年年)三个成三个成员组成。员组成。在定义并说明变量在定义并说明变量 b1 b1 和和 b2 b2 时,其中的成员时,其中的成员birthdaybirthday被说明为被说明为datedate结构类型。成员名可与程序中其它变量同名,互不干扰。结构变量成员的结构类型。成员名可与程序中其它变量同名,互不干扰。结
22、构变量成员的表示方法在程序中使用结构变量时,往往不把它作为一个整体来使用。表示方法在程序中使用结构变量时,往往不把它作为一个整体来使用。C语言教程二、二、结构体类型变量的赋值(初始化)结构体类型变量的赋值(初始化)结构体变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完结构体变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。成。上述对结构体类型变量的三种定义形式均可在定义时初始化。上述对结构体类型变量的三种定义形式均可在定义时初始化。【引例引例引例引例】结构体类型变量的初始化。结构体类型变量的初始化。struct stu/*struct stu/*定义学生结构体类型定义学生结构体类
23、型*/*/char name20;/*char name20;/*学生姓名学生姓名*/*/char sex;/*char sex;/*性别性别*/*/long num;/*long num;/*学号学号*/*/float score3;/*float score3;/*三科考试成绩三科考试成绩*/*/;struct stu student=wang li,f,050641,88.5,87.4,85;struct stu student=wang li,f,050641,88.5,87.4,85;结构体类型变量完成初始化后,即各成员的值分别为:结构体类型变量完成初始化后,即各成员的值分别为:st
24、udent.name=wang li student.name=wang li、student.sex=fstudent.sex=f、student.num=050641student.num=050641、student.sco re0=88.5student.sco re0=88.5、student.score1=87.4student.score1=87.4、student.score2=85student.score2=85。C语言教程【知识点】【知识点】与数组的初始化类似,结构体变量只能对外部和静态结构与数组的初始化类似,结构体变量只能对外部和静态结构体变量初始化。初始化数据之间要用
25、体变量初始化。初始化数据之间要用“,”逗号隔开,不逗号隔开,不进行初始化的成员项要用进行初始化的成员项要用“,”逗号跳过。逗号跳过。【典型例题】【典型例题】struct stu/*struct stu/*定义学生结构体类型定义学生结构体类型*/*/char name20;/*char name20;/*学生姓名学生姓名*/*/char sex;/*char sex;/*性别性别*/*/long num;/*long num;/*学号学号*/*/float score3;/*float score3;/*三科考试成绩三科考试成绩*/*/;struct stu student=wang li,f,
26、88.5,87.4,85;struct stu student=wang li,f,88.5,87.4,85;/*学号不进行初始化用逗号跳过学号不进行初始化用逗号跳过*/*/C语言教程例例10.3 10.3 定义结构体变量并给成员赋值。定义结构体变量并给成员赋值。定义结构体变量并给成员赋值。定义结构体变量并给成员赋值。在变量定义之后在变量定义之后,如果再想将数据装入变量如果再想将数据装入变量,只能采用给各只能采用给各成员赋值的办法,延用初始化时的作法是错误的成员赋值的办法,延用初始化时的作法是错误的:struct stu student;struct stu student;student=w
27、ang li,f,050641,88.5,87.4,85;/*student=wang li,f,050641,88.5,87.4,85;/*错误的用法错误的用法*/*/对上述的结构体类型变量成员输入采用的一般形式:对上述的结构体类型变量成员输入采用的一般形式:student.num=long atol(temp);/*student.num=long atol(temp);/*转换为长整型转换为长整型*/*/for(i=0;i 3;i+)/*for(i=0;i-结构体成员结构体成员结构体成员结构体成员 其中其中“-”“-”是两个符号是两个符号“-”“-”和和“”“”的组合的组合,好象一个箭头
28、指向结构体好象一个箭头指向结构体成员。例如要给上面定义的结构体中成员。例如要给上面定义的结构体中namename和和ageage赋值赋值,可以用下面语句可以用下面语句:strcpy(student-name,Lu ying);strcpy(student-name,Lu ying);student-age=19;student-age=19;实际上实际上,student-name,student-name就是就是(*student).name(*student).name的缩写形式。的缩写形式。C语言教程10.1.6 读懂含有结构体变量的程序读懂含有结构体变量的程序【典型例题典型例题典型例题典
29、型例题】例例例例10.5 10.5 给结构体变量赋值并输出其值。给结构体变量赋值并输出其值。main()main()struct stu struct stu int num;int num;char*name;char*name;char sex;char sex;float score;float score;b1,b2;b1,b2;b1.num=102;b1.num=102;b1.name=Zhang ping;b1.name=Zhang ping;printf(input sex and scoren);printf(input sex and scoren);scanf(%c%f,&
30、b1.sex,&b1.score);scanf(%c%f,&b1.sex,&b1.score);b2=b1;b2=b1;printf(Number=%dnName=%sn,b2.num,b2.name);printf(Number=%dnName=%sn,b2.num,b2.name);printf(Sex=%cnScore=%fn,b2.sex,b2.score);printf(Sex=%cnScore=%fn,b2.sex,b2.score);程序分析:本程序中用赋值语句给程序分析:本程序中用赋值语句给numnum和和namename两个成员赋值,两个成员赋值,namename是一个字符串
31、是一个字符串指针变量。用指针变量。用scanfscanf函数动态地输入函数动态地输入sexsex和和scorescore成员值,然后把成员值,然后把b1b1的所有成员的值整体赋的所有成员的值整体赋予予b2b2,最后分别输出,最后分别输出b2 b2 的各个成员值。本例说明了结构体变量的赋值、输入和输出的的各个成员值。本例说明了结构体变量的赋值、输入和输出的方法。方法。对于结构体变量的初始化,如果结构体变量是全局变量或为静态变量,则可对它对于结构体变量的初始化,如果结构体变量是全局变量或为静态变量,则可对它作初始化赋值;对局部或自动结构变量不能作初始化赋值。作初始化赋值;对局部或自动结构变量不能作
32、初始化赋值。C语言教程 例例10.6 10.6 定义一个结构体变量定义一个结构体变量定义一个结构体变量定义一个结构体变量,其中每个成员都从键盘接收数据其中每个成员都从键盘接收数据其中每个成员都从键盘接收数据其中每个成员都从键盘接收数据,然后对结构体中的浮点数求和然后对结构体中的浮点数求和然后对结构体中的浮点数求和然后对结构体中的浮点数求和,并显示运算结果。并显示运算结果。并显示运算结果。并显示运算结果。请注意这个例子中不同结构体成员的访问。请注意这个例子中不同结构体成员的访问。#include#include main()main()struct /*struct /*定义一个结构体变量定义一
33、个结构体变量*/*/char name8;char name8;int age;int age;char sex2;char sex2;float wage1,wage2,wage3,wage4,wage5;float wage1,wage2,wage3,wage4,wage5;a;a;float wage;float wage;char c=Y;char c=Y;while(c=Y|c=y)/*while(c=Y|c=y)/*判断是否继续循环判断是否继续循环*/*/printf(nName:);printf(nName:);scanf(%s,&a.name);/*scanf(%s,&a.na
34、me);/*输入姓名输入姓名*/*/printf(nAge:);printf(nAge:);scanf(%d,&a.age);/*scanf(%d,&a.age);/*输入年龄输入年龄*/*/printf(nSex:);printf(nSex:);scanf(%s,&a.sex);scanf(%s,&a.sex);printf(Wage1:);printf(Wage1:);scanf(%f,&a.wage1);/*scanf(%f,&a.wage1);/*输入工资输入工资*/*/printf(Wage2:);printf(Wage2:);scanf(%f,&a.wage2);scanf(%f,
35、&a.wage2);printf(Wage3:);printf(Wage3:);scanf(%f,&a.wage3);scanf(%f,&a.wage3);printf(Wage4:);printf(Wage4:);scan scanf(%f,&a.wage4);scan scanf(%f,&a.wage4);printf(Wage5:);printf(Wage5:);scanf(%f,&a.wage5);scanf(%f,&a.wage5);wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;wage=a.wage1+a.wage2+a.wage3+a.
36、wage4+a.wage5;pr printf(The sum of wage is%6.2fn,wage);/*pr printf(The sum of wage is%6.2fn,wage);/*显示结果显示结果*/*/while(1)while(1)printf(Continue?);printf(Continue?);c=getche();c=getche();if(c=Y|c=y|c=N|c=n)if(c=Y|c=y|c=N|c=n)break;break;C语言教程10.2 技能2:在程序中使用共用体类型10.2.1 10.2.1 共用体的定义共用体的定义共用体的定义共用体的定义【
37、引例引例】如果在一个函数的三个不同的程序段中分别使用了整如果在一个函数的三个不同的程序段中分别使用了整型变量型变量i i、字符变量、字符变量chch和单精度变量和单精度变量f,f,可以将它们定义为同可以将它们定义为同一类型变量一类型变量datadata,此时给三个成员一共分配四个内存单元,此时给三个成员一共分配四个内存单元 。成员。成员chch占用一个内存单元;成员占用一个内存单元;成员i i占用两个内存单元;成占用两个内存单元;成员员f f占用四个内存单元。占用四个内存单元。data data 变量中的三个成员,虽说各占变量中的三个成员,虽说各占的字节数不同,但都放在由同一个地址开始的内存单
38、元中,的字节数不同,但都放在由同一个地址开始的内存单元中,几个变量互相覆盖。这种使几个不同的变量共占用同一段几个变量互相覆盖。这种使几个不同的变量共占用同一段内存的结构,即另一种数据类型的结构内存的结构,即另一种数据类型的结构共用体。共用体。共用体也是一种新的数据类型,共用体也是一种新的数据类型,共用体也是一种新的数据类型,共用体也是一种新的数据类型,共用体类型说明和共共用体类型说明和共共用体类型说明和共共用体类型说明和共用体变量定义与结构体十分相似。用体变量定义与结构体十分相似。用体变量定义与结构体十分相似。用体变量定义与结构体十分相似。C语言教程【知识点】【知识点】1 1共用体共用体:将不
39、同名称、不同类型的一组数据组织为一个整体,共享同一存储单元,将不同名称、不同类型的一组数据组织为一个整体,共享同一存储单元,该单元的实际大小由其中的最长类型的数据确定。共用体也叫联合体。该单元的实际大小由其中的最长类型的数据确定。共用体也叫联合体。2 2共用体的定义形式:共用体的定义形式:union union 共用体名共用体名共用体名共用体名 数据类型数据类型数据类型数据类型 成员名成员名成员名成员名;数据类型数据类型数据类型数据类型 成员名成员名成员名成员名;.共用体变量名共用体变量名共用体变量名共用体变量名;3 3 共用体表示几个变量共用一个内存位置共用体表示几个变量共用一个内存位置,在
40、不同的时间保存不同的数据类型和不同在不同的时间保存不同的数据类型和不同长度的变量。长度的变量。4.4.共用体和结构体有下列区别共用体和结构体有下列区别:(1)(1)结构体和共用体都是由多个不同的数据类型成员组成结构体和共用体都是由多个不同的数据类型成员组成,但在任何同一时刻但在任何同一时刻,共用体共用体中只存放了一个被选中的成员中只存放了一个被选中的成员,而结构体的所有成员都存在。而结构体的所有成员都存在。(2)(2)对于共用体的不同成员赋值对于共用体的不同成员赋值,将会对其它成员重写将会对其它成员重写,原来成员的值就不存在了原来成员的值就不存在了,而而对于结构体的不同成员赋值是互不影响的。对
41、于结构体的不同成员赋值是互不影响的。下例表示说明一个共用体下例表示说明一个共用体data:data:union data union data int i;int i;char ch;char ch;float f;float f;C语言教程10.2.2 共用体变量的引用用已说明的共用体可定义共用体变量。用已说明的共用体可定义共用体变量。union data lgc;union data lgc;例如例如:用上面说明的共用体用上面说明的共用体datadata定义一个名为定义一个名为lgclgc的共用体变量的共用体变量,可写成可写成:在共用体变量在共用体变量lgclgc中中,整型量整型量i i和
42、字符和字符chch单精度单精度f f共用同一内存位置。共用同一内存位置。又如又如:union ataunion ata int a;int a;float b;float b;double c;double c;char d;char d;obj;obj;该形式定义了一个共用体数据类型该形式定义了一个共用体数据类型union ataunion ata,定义了共用体数据类型,定义了共用体数据类型变量变量objobj。C语言教程【典型例题】【典型例题】【典型例题】【典型例题】例例例例10.7 10.7 共用体类型与结构体类型实际占用存储空间比较。共用体类型与结构体类型实际占用存储空间比较。unio
43、n data /*union data /*共用体共用体*/*/int a;int a;float b;float b;double c;double c;char d;char d;mm;mm;struct stud /*struct stud /*结构体结构体*/*/int a;int a;float b;float b;double c;double c;char d;char d;main()main()struct stud student;struct stud student;printf(%d,%d,sizeof(struct stud),sizeof(union data);
44、printf(%d,%d,sizeof(struct stud),sizeof(union data);运行结果如下:运行结果如下:15 15,8 8程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和(程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和(2+4+8+1=152+4+8+1=15)。)。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间(而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间(8 8)。使用时,根据)。使用时,根据需要使用其中的某一个成员。方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵需要使
45、用其中的某一个成员。方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。活性,节省内存。当一个共用体被说明时当一个共用体被说明时,编译程序自动地产生一个变量,其长度为共用体中最大的变量长度。编译程序自动地产生一个变量,其长度为共用体中最大的变量长度。C语言教程例例10.8 10.8 共用体变量成员的引用情况。共用体变量成员的引用情况。共用体变量成员的引用情况。共用体变量成员的引用情况。main()main()union /*union /*定义一个共用体定义一个共用体*/*/int i;/*int i;/*共同体的成员共同体的成员i*/i*/struct /*struc
46、t /*在共用体中定义一个结构体在共用体中定义一个结构体*/*/char first;/*char first;/*结构体成员结构体成员first*/first*/char second;/*char second;/*结构体成员结构体成员second*/second*/half;/*half;/*结构体变量结构体变量half*/half*/number;/*number;/*共同体变量共同体变量number*/number*/number.i=0 x4241;/*number.i=0 x4241;/*共用体成员赋值共用体成员赋值*/*/printf(%c%cn,number.half.fir
47、st,number.half.second);printf(%c%cn,number.half.first,number.half.second);number.half.first=d;/*number.half.first=d;/*共用体中结构体成员赋值共用体中结构体成员赋值*/number.half.second=e;*/number.half.second=e;printf(%xn,number.i);printf(%xn,number.i);getch();getch();输出结果为输出结果为:DE DE 6564 6564 从上例结果可以看出从上例结果可以看出:当给当给i i赋值后
48、赋值后,其低八位也就是其低八位也就是firstfirst和和secondsecond的值的值;当给当给firstfirst和和secondsecond赋字符后赋字符后,这两个这两个 字符的字符的ASCIIASCII码也将作为码也将作为i i 的低的低8 8位和高位和高8 8位。位。共用体访问其成员的方法与结构体相同。共用体访问其成员的方法与结构体相同。若定义共用体类型为:若定义共用体类型为:union data/*union data/*共用体共用体*/*/int a;int a;float b;float b;double c;double c;char d;char d;mm;mm;其成员
49、引用为:其成员引用为:mm.a,mm.b,mm.c,mm.dmm.a,mm.b,mm.c,mm.d。C语言教程【点拨】【点拨】【点拨】【点拨】1 1不能同时引用共用体的成员。在某一时刻,只能使用其中之一。不能同时引用共用体的成员。在某一时刻,只能使用其中之一。2 2共用体变量也可以定义成数组或指针,但定义为指针时共用体变量也可以定义成数组或指针,但定义为指针时,也要用也要用“-”“-”符号符号,此时共用体访问成员可表示成此时共用体访问成员可表示成:共用体名共用体名-成员名成员名 3 3共用体可以出现在结构体内共用体可以出现在结构体内,它的成员也可以是结构体。它的成员也可以是结构体。例如例如:若
50、要访问结构体变量若要访问结构体变量y1y1中共用体中共用体x x的成员的成员i,i,可以写成可以写成:y1.x.i;:y1.x.i;若要访问结构体变量若要访问结构体变量y2y2中共用体中共用体x x的字符串指针的字符串指针chch的第一个字符的第一个字符可写成可写成:*y2.x.ch;:*y2.x.ch;若写成若写成“y2.x.*ch;”“y2.x.*ch;”是错误的。是错误的。struct int age;struct int age;char*addr;char*addr;union union int i;int i;char*ch;char*ch;x;x;y10;y10;C语言教程10