C语言超级奥妙-结构体与链表

发布时间 : 星期日 文章C语言超级奥妙-结构体与链表更新完毕开始阅读

}

scanf(\head=insert(head,stud); printf(\插入后链表为:\\n\print(head);

第10章

结构体与共用体

17

【思考】修改程序,使得插入或者删除的结点个数可变。

10.3 共 用 体

10.3.1 共用体的概念

共用体是使几个类型相同或不同的成员变量占用同一段内存的结构。它与结构体类似,都属于构造数据类型,都由若干类型可以互不相同的成员组成。但不同的是,结构体变量的各个成员拥有自己独立的存储单元,而共用体变量的各个成员“共用”一段内存,该内存段允许各成员在不同的时间分别起作用。

c 如图10.22所示,利用共用体可以把字符型变量c、短

i 整型变量i及浮点型变量f当作成员放在同一个地址开始的

f 内存单元中。尽管三者在内存中占用的字节数不同,但都可以通过共用体变量来访问。相比结构体类型,这样可以更有效地利用内存。 图10.22 共用体变量内存分配图 【说明】共用体各成员变量的存储空间是相互覆盖的,一

个成员变量值的改变会影响其他成员变量。

【注意】图10.22中,共用体变量所占的存储空间不是三个成员变量所占空间的和,而是三

者的最大值。 10.3.2 共用体的定义

格式:union 共用体类型名

{

类型1 成员名1; 类型2 成员名2;

? 类型N 成员名N; }共用体变量名列表;

功能:定义一种共用体类型与若干该类型的共用体变量。 例如:

union udata { char c; short i;

float f; }data1,data2;

第10章

结构体与共用体

18

【说明】共用体类型的声明与共用体变量的定义可以分开,也可以直接定义共用体变量。

union udata { char c; short i; float f; };

union udata data1,data2;

union { char c; short i; float f; }data1,data2;

【注意】共用体可以出现在结构体类型的定义中,反之也可。 10.3.3 共用体变量的引用

格式:共用体变量名.成员名

功能:引用共用体变量中指定名称的成员变量。 例如:

union udata data1,data2; data1.c='A'; data1.i=66;

printf(\scanf(\data2.f=data1.i+2;

【说明】① 共用体变量的地址和其各成员的地址相同。

② 每改变一个成员的值,共用体中其他成员的值都可能改变,因此,共用体变量中起作用的是最后一次改写的成员。

③ 共用体变量不能整体赋值,也不能初始化。以下两条语句均不正确:

union udata data1,data2={'A',5,2.3}; data2='B';

④ 共用体变量不能作函数参数或函数返回值,但可以使用指向共用体变量的指针。

【思考】分析以下程序片段的执行结果:

union {

char c[2]; short i; }data; data.i=0x4241; printf(\

10.3.4 共用体应用举例 num10011002name定义结构体数组optionalstu[N]scorezhangfor(i=1;i<=N;i++)F83.5wang输入学号、姓名及选课性质TBY学生成绩表图10.23 输入成绩级别for(i=1;i<=N;i++)输出学号、姓名Y选修N选修N输入分数例10.12 某门课程,部分学生选修,部分学

生必修。对选修学生按等级制打分,分A、B、

C、D、E五级,对必修课学生按百分制打分。要求定义如图10.23所示的结构体,然后进行

输出选修级别输出必修分数图10.24 主函数N-S图

第10章

结构体与共用体

19

输入输出。

程序的算法描述如图10.24所示,代码如下:

#include #define N 3 struct student { int num; char name[20]; char optional; union { float mark; char grade; }score; };

void main() { struct student stu[N]; int i; printf(\请输入%d个学生的信息:\\n\ printf(\学号 姓名 是否选修 成绩\\n\ for(i=0;i

【说明】可以在主函数内定义结构体和共用体,此时两者只在主函数内部起作用。

10.4 枚 举 类 型

10.4.1 枚举的概念

编程处理实际问题时,存在某些变量,它们的取值被限定在一个有限的范围内。例如,表示性别的变量只有“男”或“女”两种取值,表示月份的变量只有12个不同的取值,如此等等。把这些量定义为字符型、整型或其他类型都不是很合理,为此,C语言中引入了一种新的基本数据类型——枚举类型。

第10章

结构体与共用体

20

10.4.2 枚举的定义

格式:enum枚举类型名

{

枚举常量列表 }枚举变量名列表;

功能:定义一种枚举类型与若干该类型的枚举变量。 例如:enum workday { mon,tue,wed,thr,fri } d1,d2;

【说明】① 枚举常量列表中列举了该枚举类型的变量所有可能的取值;

② 枚举类型的声明与枚举变量的定义可以分开,也可以直接定义枚举变量。如

enum workday { mon,tue,wed,thr,fri };

enum workday d1,d2;

enum {

mon,tue,wed,thr,fri }d1,d2;

【注意】① 定义枚举时,各枚举常量之间用逗号分

隔,且最后一个枚举值常量后无分号。

② 枚举变量的取值必须来自枚举常量列表,如语句enum workday d1=sat不正确。 ③ 枚举常量实际上是一个标识符,其值是一个整型常数,默认情况下,各枚举常量按定义时的顺序,从0开始取值,依次增1。当然,也可以在定义时显式地指定各枚举常量的取值,具体形式如下:

enum 枚举类型名 {

标识符1[=整型常数1], 标识符2[=整型常数2], ?

标识符n[=整型常数n] }枚举变量名列表;

④ 当某个枚举常量被显式赋值后,其后未显式赋值的枚举常量将根据按出现顺序依次加1的规则确定其值。如以下程序片段输出结果为-9:

enum color { red=-10, orange, yellow=0, green=10 };

enum color x=orange; printf(\

10.4.3 枚举变量

1. 枚举变量的赋值

(1)使用枚举常量为枚举变量赋值,如enum workday d=mon。

联系合同范文客服:xxxxx#qq.com(#替换为@)