电子技术第十章结构体与共用体
第十章结构体与共用体
共用体类型可以出现在结构体类型定义中,也 可以定义共用体数组。反之,结构体也可以出 现在共用体类型定义中,数组也可以作为共用 体的成员。
应用情况
设有若干个人员的数据,其中有学生和教师。 学生的数据中包括:姓名、号码、性别、职 业、班级。教师的数据包括:姓名、号码、 性别、职业、职务。可以看出,学生和教师 所包含的数据是不同的。现要求把它们放在 同一表格中。
enum weekday{ sun,mou,tue,wed,thu,fri,sat }; enum weekday a, b, c;
或者为:
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a, b, c;
或者为:
enum { sun,mou,tue,wed,thu,fri,sat }a, b, c;
枚举类型中需要注意的地方
在“枚举”类型的定义中列举出所有可能的取 值,被说明为该“枚举”类型的变量取值不能 超过定义的范围。
应该说明的是,枚举类型是一种基本数据类型, 而不是一种构造类型,因为它不能再分解为任 何基本类型。
在枚举值表中应罗列出所有可用值。这些值也 称为枚举元素。
枚举类型中需要注意的地方
在C编译中,对枚举元素按常量处理,故称枚 举常量。它们不是变量,不能对它们赋值。
枚举元素作为常量,它们是有值的,C语言编 译按定义时的顺序使它们的值为0,1,2…
枚举值可以用来作判断比较。
一个整数不能直接赋给一个枚举变量。
体验
例子一:enum.c 例子二:enum2.c
同一个内存段可以用来存放几种不同类型的成 员,但在每一瞬时只能存放其中一种,而不是 同时存放几种。
第10章 结构体与共用体
第10章结构体与共用体考核知识点●结构体与共用体类型数据的定义方法和引用方法●用指针和结构体构成链表,单向链表的建立、输出、插入与删除重要考点●对结构体的声明及定义●访问结构体的成员的方法●熟悉对链表的操作10.1 用typedef说明一种新类型名C语言规定可以用typedef说明一种新的类型名,说明新类型名的语句一般形式为:typedef 类型名称标识符;其中,“类型名”一定是在此语句之前已有定义的类型标识符。
“标识符”是一个用户定义标识符,用来标识新的类型名。
typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并没有产生新的数据类型,因此,原有的类型名依然有效。
提示:声明一个新的类型名的具体步骤如下:⑴先按定义变量的方法写出定义的主体(如float a;).⑵将变量名换成新类型名(如将a换成FLO)。
⑶在最左面加上关键字typedef(如typedef FLO).⑷然后可以用新类型名去定义其他的变量(如FLO b;).10.2 结构体类型在实际工作中,当我们需要把一些不同类型,但相互之间又存在着联系的信息组合应用时,就要用到结构体。
结构体是一种看似复杂却非常灵活的构造数据类型。
在通常情况下,一个结构体类型由若干个称为成员(或称为域)的部分组成。
不同的结构体类型可根据需要由不同的成员组成。
但对于某个具体的结构体类型,其成员的数量必须固定,这一点与数组相同;但结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。
例如,我们常用的“时间”可以由以下3个部分描述:小时(hour)、分(minute)、秒(second)。
它们都可以用整型数表示,可以把这3个成员组成一个整体,并给它取名为time,这就是一个简单的结构体。
声明一个结构体类型的一般形式为:struct 结构体名{成员表列};struct是C语言中的关键字,是结构体类型的标志。
“结构体名”用做结构体类型的标志,它又称“结构体标记”(structure)。
最新第10章结构体、枚举和共用体类型PPT课件
/*输出*/
{printf("number:%6d\n ", stu[i].number);
printf("name: %s\n", stu[i].name);
printf("score: ");
for(k=0;k<4;k++)
printf("%6.2f" , stu[i].score[k]);
printf("\ntotal=%10.2f average=%10.2f\n ", stu[i].total, stu[i].ave);
for (i=0;i<N;i++)
/*输出*/
output(&stu[i]);
}
10.2结构体和函数
结构体数组作函数参数
向函数传递结构体数组实际也是传递数组的首地址。形 参数组与实参数组使用共同的内存单元。
函数形参、实数是同类型的结构体数组名或结构体指针。
【例10.5】重新编写例10.4。
#define N 50
for(k=0;k<4;k++)
scanf("%f",&stu[i].score[k]); stu[i]. total = total(stu[i].score,4); /*计算总成绩*/ stu[i].ave=average(stu[i].total,4); /*计算平均成绩*/
} for (i=0;i<N;i++)
struct student
{int number;
/*学号*/
char name[10];
/*姓名*/
专题10 结构体和共用体的概念及应用
4)使用typedef说明一个结构体类型,再用新类型名来定义变量(常用)
typedef { struct
typedef struct ST { struct date birthday; a; long int b; float sc[4]; char c[2]; }STREC; } NEW; // STREC是一个具体的结构体类型名,可以用它来定义相应的变量,就如int、char 则下面叙述中正确的是 一样,用它来定义变量时,就不能用struct A)以上的说明形式非法 B)ST是一个结构体类型 C)NEW是一个结构体类型 D)NEW是一个结构体变量 STREC std,pers[3],*pstd;
练习
3.以下结构体类型说明和变量定义中正确的是 [08年4月份题目] A)typedef struct {int n; char c;}REC; REC t1,t2; B)struct REC; {int n; char c;}; A REC t1,t2; C)typedef struct REC ; {int n=0; char c='A';}t1,t2; D)struct {int n;char c;}REC REC t1,t2;
练习
4.有以下程序[08年9月] C #include<stdio.h> struct st {int x,y;}data[2]={1,10,2,20}; main() { struct st *p=data; printf("%d,",p->y); printf("%d\n",(++p)->x); } 程序的运行结果是 A) 10,1 B)20,1 C) 10,2 D)20,2 5.有以下程序[08年9月] main() D { struct STU { char name[9]; char sex; double score[2];}; struct STU a={"Zhao",'m',85.0,90.0},b={"Qian",'f',95.0,92.0}; b=a; //结构体变量可以直接赋值 printf("%s,%c,%2.0f,%2.0f\n", , b.sex, b.score[0], b.score[1]); } 程序的运行结果是( ) A) Qian,f,95,92 B) Qian,m,85,90 C) Zhao,f,95,92 D) Zhao,m,85,90
结构体与共用体
10. 1 结构体数据
• 【注意】 • (1) 不能将一个结构体变量作为一个整体进行赋值和输出; 只能对其各
个成员分别输出。 • ( 2) 对成员变量可以像普通变量一样进行各种运算。例如: • sumage = stu1. age + stu2. age; • (3) 既可以引用成员的地址, 也可以引用结构体变量的地址。例如: • printf("score = %f",stu2. score); • (4) 若成员本身还属于一个结构体类型, 则只能对最低级的成员进行赋
给出结构变量。 • 三种方法中声明的stu1、stu2 变量都具有图10. 1 所示的结构。
上一页 下一页 返回
10. 1 结构体数据
• 这说明变量stu1、stu2 为student 类型后, 即可向这两个变量中的各 个成员赋值。在上述结构体定义中, 所有成员都是基本数据类型或数 组类型。
• 【注意】 • (1) 类型与变量是不同概念, 不要混淆。 • (2) 结构体中的成员, 可以单独使用, 其作用与地位相当于普通变量。 • (3) 成员也可以是一个结构体变量。 • (4) 成员名可以与程序中的变量名相同, 二者不代表同一对象。
• };
• 在这个结构体数据类型定义中, struct 是C 语言关键字, student 是结 构体名, 该结构体由5 个成员组成。第1 个成员为num, 字符串变量; 第2 个成员为name, 字符串变量; 第3个成员为age, 整型变量; 第4 个 成员为sex, 字符变量; 第5 个成员为score, 实型变量。
下一页 返回
10. 1 结构体数据
• 例如, 上述学生信息数据的描述可以定义结构体数据类型为
• struct student
第10章结构体与共用体
一般形式:
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列; 用无名结构体直接定义 变量只能一次
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
说明:
结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期
struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. };
合法标识符 可省:无名结构体 成员类型可以是 基本型或构造型
struct是关键字, 不能省略
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
num
2字节
…
name
20字节 1字节 2字节 4字节
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
10.8 共用体
共用体类型定义 定义形式:
union 共用体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. };
****类型定义不分配内存
例 union data { int i; char ch; float f; };
10/31/2018
江苏海事职业技术学院10章 结构体与共用体
用typedef定义类型
功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name; 例 typedef int INTEGER; 例 typedef float REAL; 例 INTEGER a,b,c; REAL f1,f2;
结构体与共用体
10.1 结构体类型和结构体变量
如:
struct date
/*声明一个结构体类型*/
{ int month;
int day;
int year;
};
struct student
{int num;
char name[20];
char sex;
int age;
struct date birthday;/*birthday是struct date类 型*/
10.1.1 结构体型的定义
如前所述,结构体是由不同数据类型的数据组成的。组成结 构体的每一个数据称为该结构体的成员。在程序中使用结构 体时,首先要对结构体的组成进行描述,这称为结构体型的 定义,结构体型的定义是确定该结构体型由哪几个成员项组 成,以及每个成员项具有什么数据类型。
下一页 返回
10.1 结构体类型和结构体变量
10.1 结构体类型和结构体变量
注意不要忽略最后的分号。struct student向编译系统声 明这是一个“结构体类型”,它包括num、name、sex、 age、score和addr等不同类型的数据项。应当说明 struct student是一个类型名,它和系统提供的标准类型 (如int、char、float和double等)一样具有同样的地位 和作用,都可以用来定义变量的类型,只不过结构体类型需 要由用户自己指定而已。
上一页 下一页 返回
10.1 结构体类型和结构体变量
例10-1 定义如下结构体型。 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
结构体与共用体小结
结构体与共用体小结结构体与共用体小结一,结构体得概念与定义1,结构体得定义struct结构体名{数据类型成员名1;数据类型成员名1;、。
};这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套;2,结构体变量得定义struct 结构体名变量名1,变量名2,,,变量名n;或:struct结构体名{数据类型成员名1;数据类型成员名1;。
、}结构体变量1,结构体变量2;或:struct{数据类型成员名1;数据类型成员名1;。
、}结构体变量1,结构体变量2;三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码;其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样;3,结构体变量得引用只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出;嵌套得结构体类型得引用:结构体变量名。
结构体类型成员名、内嵌结构体得成员名;4,结构体变量得初始化struct 结构体名变量名= {初始化数据};或者在定义得时候就初始化: struct结构体名{数据类型成员名1;数据类型成员名1;。
、、}变量名= {初始化数据};二,结构体数组1,结构体数组得定义举例struct stu{int stu_nu;char name[20];floatscore;};struct stu student[5];或者:struct stu{int stu_nu;char name[20];float score;}student[5];或者:struct{int stu_nu;char name[20];float score;}student[5];跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得;2,结构体数组得初始化与引用略;三,结构体与指针1,指向结构体得指针得定义,同上,也就是三种形式;struct employeesemployee1,*p1;或者:struct employees、。
结构体与共用体
2020/12/16
15
8.1 结构体
8.1.2 结构体数组
定义结构体数组的方法和结构体变量相似:
(1) struct 结构体名 {成员表列} 数组名[数组长度];
(2) 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名[数组长度];
例8.3 编写程序,利用结构体数组存储和显示三个学生的信息。 算法描述:首先定义并初始化一个结构体数组,然后通过printf 函数输出到屏幕上即可。
return 0;
}
2020/12/16
17
8.1 结构体
程序分析: 程序中定义了一个外部结构体数组stu,共3个元 素,并作了初始化赋值。在main函数中用for语句 逐个输出各元素的各个成员值。
2020/12/16
18
8.1 结构体
8.1.3 结构体指针
指向结构体变量的指针
例8.4 使用指向结构体变量的指针来访问结构体变量的 各个成员。
struct student
{ int num;
char name[10];
float score; };
int main ()
{struct student stu[3]={{1, "Wang", 90.0}, {2, "Qian", 89.5}, {3, "Sun", 85.0}};
struct student *p; int i;
注意 : (1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号 括起来的一些常量。如:
struct Student a={10001,"Li Ming",'M',"Bei Jing"};
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章结构体与共用体、选择题1•在说明一个结构体变量时系统分配给它的存储空间是___________ 。
(0级)A该结构体中第一个成员所需存储空间B)该结构体中最后一个成员所需存储空间C)该结构体中占用最大存储空间的成员所需存储空间D)该结构体中所有成员所需存储空间的总和2•若有以下说明和语句:struct worker{ int no; char * name; }work, * p=&work;则以下引用方式不正确的是。
(1级)A)work . no B) ( * p). no C) p->no D)work->no3.有如下定义:struct date { int year, mon th, day; };struct worklist { char n ame[20]; char sex;struct date birthday; }pers on;对结构体变量person的出生年份进行赋值时, (1级)A) year=1958C) person. birthday . year=19584.以下对结构体类型变量的定义中不正确的是A) #define STUDENT struct studentSTUDENT{ int num;float age; }std1;C) struct{ int num;float age;}std1;5.设有以下说明语句struct stu{ int a; float b; }stutype;则下面的叙述不正确的是_____________A)struct是结构体类型的关键字B)struct stu是用户定义的结构体类型C)stutype是用户定义的结构体类型名D)a和b都是结构体成员名6.C语言结构体类型变量在程序执行期间A)所有成员一直驻留在内存中B)只有一个成员主留在内存中C)部分成员驻留在内存中D)没有成员驻留在内存中下面正确的赋值语句是 _______________B)birthday . year=1958D) person. year=1958___________ 。
(1 级)B)struct stude nt { int num;float age;}std1;D) struct{ int num;float age; } stude nt;struct stude nt std1;(1级)O ( 0 级)。
(1 级)7•以下程序的运行结果是# in elude <stdio.h>mai n(){ struct date{ int year, mon th, day; }today;printf( %d\n ”,sizeof(struct date)); }A) 6 B) 8 C) 10 D)128.有如下定义struct pers on {char n ame[9]; int age;};struct person class[10]={ 17ohu ” ,“ Paul ” , 19“ Mary ” , 18,“ Adam 16,};根据上述定义,能输出字母M的语句是_____________ 。
(1级)A)prinft( "r%c,class[3].ma ne);B)pfintf( "r%c,class[3]. name[1]);C)prinft( "r%c,class[2]. name[1]);D)printf( “ %^c,class[2].name[0]);9.设有如下定义struct ss{ char n ame[10];int age;char sex;} std[3],* p=std;下面各输入语句中错误的是___________ o( 1级)A)scan f("%d",&(*p).age);B)scan f("%s",& std. name);C)scan f("%c",&std[0].sex);D)scan f("%c",&(p->sex))10.设有以下说明语句,则下面的叙述中不正确的是___________ o (1级)struct ex {int x ; float y; char z ;} example;A) struct结构体类型的关键字B) example是结构体类型名C) x,y,z都是结构体成员名D) struct ex是结构体类型11.若程序中有下面的说明和定义:struct stt{ int x;char b;}struct stt a1,a2;则会发生的情况是 _________ o ( 1级) A)程序将顺利编译、连接、执行。
B)编译出错。
C)能顺利通过编译、连接,但不能执行。
D)能顺利通过编译,但连接出错。
12•已知教师记录定义为:struct stude nt{ int no; char n ame[30]; struct{un sig ned int year;un sig ned int mon th; un sig ned int day; }birthday; } stu;struct stude nt *t = & stu;若要把变量 t 中的生日赋值为“ 为 ________ 。
( 1级)A) year = 1980;mon th = 5; day = 1; C)t.birthday.year = 1980; t.birthday. month = 5;t.birthday.day = 1;13.以下结构类型可用来构造链表的是 — A) structaa{ int a ;int * b ; }; B) structbb{ int a ;bb * b ; }; C) structcc{ int * a ; cc b ; }; D)structdd{ int * a ; aa b;};14.以下程序的输出结果是 。
(2级)amovep(int *p, int a[3][3],int n) { int i, j;for( i=0;i< n; i++)for(j=0;j< n;j++){ *p=a[i][j];p++; } } mai n(){ int *p,a[3][3]={{1,3,5},{2,4,6}}; p=(i nt *)malloc(100); amovep(p,a,3);prin tf("%d %d \n ”,p[2],p[5]);free(p); } A ) 56B ) 25C ) 34D)程序错误15. _________________________________ 以下程序的输出结果是。
( 2级)struct HAR { int x, y; struct HAR *p;} h[2]; mai n(){ h[0].x=1;h[0].y=2; h[1].x=3;h[1].y=4; h[0].p=&h[1].x; h[1].p=&h[0].x;prin tf("%d %d \n ",(h[0].p)->x,(h[1].p)->y); } A )12B )23C )14D )32二、 填空题1•有如下定义:(1级)struct {int x; int y; }s[2]={{1,2},{3,4}},* p=s;1980年5月1日”,则正确的赋值方式B) t.year = 1980;t.m on th = 5; t.day = 1;D) t-> birthday.year = 1980; t-> birthday. month= 5;t-> birthday.day = 1;_____。
( 1 级)贝U:表达式++p->x的结果是___________ 。
表达式++p->x的结果是____________ 。
2•若有定义:(2级)struct num {int a; int b; float f; }n={1,3, 5.0}};struct num * pn=&n;则表达式pn->b/n . a * ++pn->b的值是__________ ,表达式(* pn). a+pn->f的值是__________ 。
3.若要使指针p指向一个double类型的动态存储单元,请填空。
(1级)p= ___________ malloc(sizeof(double));4.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是 ______________ 。
(1级)Struct stud{ char nu m[6];int s[4];double ave;} a,*p;三、程序填空题1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。
请填空。
(1级)static struct man{ char name[20]; int age; }person[ ]= { li-ming ”,18, Wang-hua”,19,"zhang-ping",20}; mai n(){struct man *p ,* q; int old=0; p=pers on; for( ; (1) _____ )if(old<p->age) {q=p; (2) ____ ;}printf( %s %d", _______ (3 __________ ); }2.以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点的指针(链表不带头结点)。
请填空。
(1级)struct li nk{char data; struct link *n ext; };struct link * p, * first; int c=0; p=first;while ( (1) ) { (2) ;p= 一(3 _______ ;}3.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域( data)和指针域(next),数据域为整型。
以下函数求出链表中所有链结点数据域的和值,作为函数值返回。
请填空。
(2级)struct li nk{int data; struct link *n ext; };mai n(){ struct link *head;sum(head);}sum( (1) ){ struct link *p; int s=0;p=head->n ext;while(p) {s+= (2) ; p= (3) ; }return(s);}4•已知head指向单链表的第一个结点,以下函数完成往降序单向链表中插入一个结点,插入后链表仍有序。