C语言程序设计——结构体和共用体(完整版)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

printf(“name\tage\tjob\tclass/office\n”); for(i=0;i<PN;i++) {if(body[i].job==„s‟) printf(“%s\t%d\t%3c\t%d\n”,body[i].name, body[i].age,body[i].job,body[i].units.class); else printf(“%s\t%d\t%3c\t%s\n”,body[i].name, body[i].age,body[i].job,body[i].units.office); } }
嵌套的结构体
一个结构体的成员又是一个结构体。 例: struct date struct student {int month; {int num; int day; char name[20]; int year; char sex; } int age; struct date birthday; char addr[30]; };
(2)enum weekday 定义同时说明; {sun,mon,tue,wed,thu,fri,sat}a,b,c; (3)enum 直接说明。 {sun,mon,tue,wed,thu,fri,sat}a,b,c;;
结构体变量的定义
(2)在声明结构类型的同时定义结构体变量 例:struct student {int num; char name[20]; float score; }stu1, stu2;
结构体变量的定义
(3)直接定义结构体类型变量 例:struct {int num; char name[20]; float score; }stu1, stu2;
例:struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; };
结构体变量的定义
(1)先声明结构类型,再定义结构体变量 例:struct student {int num; char name[20]; float score; }; struct student stu1, stu2;
例:enum weekday {sun,mon,tue,wed,thu,fri,sat}; 声明了一个枚举类型enum weekday,可以用此类型来 定义变量,该变量只能取7天中的某一天。
枚举变量的说明(3种形式)
(1)enum weekday {sun,mon,tue,wed,thu,fri,sat}; enum weekday a,b,c; 先定义再说明;
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
int n,i; for(i=0;i<PN;i++) {printf(“input name,age,job and department\n”); scanf(“%s%d%c”,body[i].name,&body[i].age, &body[i].job); if(body[i].job==„s‟) scanf(“%d”,&body[i].units.class); else scanf(“%s”,body[i].units.office); }
共用体的定义
共用体与结构体的类型声明方法类似。 共用体的关键字为union。
一般形式:union 共用体名 union department {成员列表 {int class; }; char office[20]; 其中各成员都应进行类型说明,即 }; 类型名 成员名;
共用体变量的说明(3种形式)
结构体变量的赋值
通过输入语句或赋值语句,实现对结构体变量的 成员赋值。 例:#include<stdio.h> void main( ) {struct student {int num; char name[20]; float score; }stu1; stu1.num=1301; stu1.name=”Zhang San”; scanf(“%f”,&stu1.score); printf(“No.%d,Name:%s,Score:%f\n”, stu1.num,stu1.name,stu1.score); }
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。
一般形式:enum 枚举名 {枚举值表 }; 在枚举值表中应罗列出所有可用值,这些值称之为枚 举元素。
பைடு நூலகம்
12.4.2指向结构体数组的指针变量 结构体指针变量可指向一个结构体数组,其指针变 量的值是整个结构体数组的首地址。 例: 设ps为指向结构体数组的指针变量, 则ps指向该结构体数组的0号元素; ps+1指向该结 构体数组的1号元素。
例:#include<stdio.h> void main( ) {struct student {int num; char name[20]; float score; }stu[3]={{1301,”Zhang San”,57}, {1302,“Li Si”,82.50},{1303,“Wang Wu”,69}}; struct student *ps=stu; ps++; printf(“No.%d,Name:%s,Score:%f\n”, ps->num, ps-> name, ps-> score); }
(1)union department 先定义再说明; {int class; char office[20]; }; union department a,b; (2)union department 定义同时说明; {int class; char office[20]; }a,b; (3)union 直接说明。 {int class; char office[20]; }a,b;
12.4.1指向结构体变量的指针变量 用结构体指针变量,访问结构体变量的各个成员, 一般形式为: (*结构体指针变量).成员名; 或 结构体指针变量- >成员名; 例: (*pstu).num 或 pstu- >num
例:#include<stdio.h> void main( ) {struct student {int num; char name[20]; float score; }stu1={1301,”Zhang San”,82.50},*pstu; pstu=&stu1; printf(“No.%d,Name:%s,Score:%f\n”, stu1.num,stu1.name,stu1.score); printf(“No.%d,Name:%s,Score:%f\n”, (*pstu).num, (*pstu). name, (*pstu). score); printf(“No.%d,Name:%s,Score:%f\n”, pstu->num, pstu-> name, pstu-> score); }
§12.5向函数传递结构体(3种方式)
1.用结构体的单个成员作为函数参数,向函数传递结 构体的单个成员。 这与普通类型的变量作函数参数没什么区别,都是 传值调用,在函数内部对其进行操作,不会引起实 参结构体成员值的变化。
2.用结构体变量作为函数参数,向函数传递结构体的 完整结构。 这种传递,是将整个结构体成员的内容复制给被调 函数。这种方式是传值调用,在函数内部对其进行 操作,不会引起实参结构体成员值的变化。 3.用结构体指针或结构体数组作为函数参数,向函数 传递结构体的地址。 由于是传地址调用,在函数内部对其进行操作,将 影响实参结构体成员值的变化。
100101 Li Fun
§12.2结构体的定义
结构是一种构造数据类型(“结构”是由若干个成员组 成的),在使用之前必须先定义,然后才能用来定义 相应的结构体变量、结构体数组、结构体指针变量。
结构体类型一般形式:struct 结构体名 {成员列表 }; 其中各成员都应进行类型说明,即 类型名 成员名;
第十二章

问题:
有时需要将不同类型的数据组合成一个有机
的整体,以便于引用。如: 一个学生有学号/姓名/性别/年龄/地址等属性 int num; char name[20]; char sex; int age; int char addr[30]; num name sex M age 18 score addr 87.5 Beijing
例:设有一个教师和学生通用的表格,有姓名、年龄、职 业、单位4项。在职业项中,用‘s’表示学生,用‘t’ 表示教师。编程输入人员数据,再以表格输出。 #include<stdio.h> #define PN 3 void main( ) {struct {char name[10]; int age; char job; union {int class; char office[10]; }units; }body[PN];
birthday num name sex age month day year addr
§12.3结构体数组
结构体数组的每一个元素都是具有相同结构类型 的结构体变量。 例:struct student {int num; char name[20]; float score; }stu[3]; 其中,定义了一个结构体数组stu,共有3个元素, 每个元素都具有struct student的结构形式。
结构体数组的初始化赋值
例:struct student {int num; char name[20]; float score; }stu[3]={{1301,”Zhang San”,57}, {1302,“Li Si”,82.50},{1303,“Wang Wu”,69}}; 当对全部元素进行初始化赋值时,也可以不给出长度。
结构体变量的引用
一般对结构体变量的使用,包括赋值、输入、 输出、运算等都是通过其成员来实现的。 结构体变量成员的表示方法: 结构体变量名.成员名
例:stu1.num (学生1的学号) stu1.score(学生1的分数)
结构体变量的初始化
和其他类型变量一样,定义结构体变量的同时, 给它的成员赋初值。 例:#include<stdio.h> void main( ) {struct student {int num; char name[20]; float score; }stu1={1301,”Zhang San”,82.50}; printf(“No.%d,Name:%s,Score:%f\n”, stu1.num,stu1.name,stu1.score); }
共用体与结构体的区别
(1)结构体变量所占内存长度是各成员占的内存长 度之和。每个成员分别占有自己的内存单元。 (2)共用体变量所占内存长度是最长的成员的长度。 即共用体变量的地址和它的各成员的地址是同一地 址。
共用体变量的引用
对共用体变量的使用,包括赋值、使用只能是对 变量的成员进行。 共用体变量成员的表示方法: 共用体变量名.成员名 例:a.class a.office 不允许对共用体变量作初始化赋值,赋值只能在 程序中进行。
§12.4结构体指针变量
12.4.1指向结构体变量的指针
一般形式为: struct 结构名 *结构体指针变量名; 例:struct student {int num; char name[20]; float score; }; struct student *pstu; 其中定义了一个指向student的指针变量pstu。
相关文档
最新文档