c语言9结构体与共用体

合集下载

《C语言参悟之旅》第九章 结构体 共用体

《C语言参悟之旅》第九章 结构体 共用体

2. 第二种形式
这种形式在声明类型的同时定义变量。其一般形式为:
struct 结构体类型名
{
数据类型名 1 成员名 1;
… 数据类型名 n
成员名 n;
} 变量名列表;
同样是定义两个 hero 类型变量 wusong 和 sunerniang,用此种形式定义如下:
struct hero {
int number; char sex; char star_name[20]; char name[20]; char nickname[20]; char position[20]; char weapon[20]; } wusong,sunerniang;
//绰号 //职业 //使用武器
} wusong={14,'m',"天伤星","武松","行者","步兵头领","2 把戒刀"}; //定义了结构体变量 wusong 并初始化
定义结构体变量 wusong 但没有初始化时,编译器会给每个成员一个默认值,初始化后 就赋予初始化时的赋值,如图 9.4 所示。
在现实生活中可以用结构体表示的事物比比皆是,例如,我国四大名著之一——《水浒
传》,其中包括性格各异的 108 个人物,如果现在要使用一种 C 语言的数据类型表示这些人 物,结构体无疑是最佳选择。下面用一个名为 hero 的结构体来表示:
struct hero {
int number; char sex; char star_name[20]; char name[20]; char nickname[20]; char position[20]; char weapon[20]; };

C语言数据结构-第9章 结构体共用体与枚举

C语言数据结构-第9章 结构体共用体与枚举
"Guang Zhou","13901000002"}, {"Gu YuPing",18,"F","2019010003",2019,5,5,"Han",
"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];

C语言各章节单元测试题及答案——结构体与共用体

C语言各章节单元测试题及答案——结构体与共用体

第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。

A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。

✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。

malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。

答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。

✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。

A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。

✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。

它应该等于结构体每个成员所占的字节数之和。

m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。

结构体与共用体

结构体与共用体

4、共用体类型的变量如何赋初值,含义是什么?
不能对共用体变量名赋值,也不能在定义共用体变量时初始化。但可以用一个共用体变量为 另一个变量赋值
例:union
{ int i;
char ch;
double f;
}a={1,’a’,1.5}; ()
a=1;
()
m=a;
()
例:float x; union { int i; char ch; double f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; () x=a.f; ()
二. 枚举类型的应用
• 1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量
enum week{sun,mon,tue,wed,thu,fri,
sat};
enum week weekday,workday; ◆定义枚举类型的同时定义枚举变量 enum color {red,blue,green,black}a,b,c;
共用体类型的关键字
union 联合类型名 { 数据类型 成员名1 数据类型 成员名2
...........
数据类型 成员名n };
例:
union utype {
char ch; int i; float f; };
2、如何定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i;
◆直接定义枚举变量 enum {male,female}sex1,sex2;
枚举类型变量的特点
例 enum DAY {
MON=1, TUE, WED, THU, FRI, SAT, SUN };
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

C语言第9章结构体、共用体、枚举

C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类

C语言学习入门笔记之结构体与共用体

C语言学习入门笔记之结构体与共用体

结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。

在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。

定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。

上面的结构体声明中Student就是结构体名(结构体标记)。

2.花括号内是该结构体所包括的子项,称为结构体的成员。

“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。

对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。

例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。

例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。

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

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

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); } }
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的结构形式。
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。

C语言程序设计 - 结构体和共用体-样本教案

C语言程序设计 - 结构体和共用体-样本教案
struct student类型的数据。
1.用指针处理链表
指向结构体类型数据的指针;用指针处理链表
3.结构变量在函数中的应用
在C语言中,允许结构变量的成员,结构变量的整体和结构变量的地址做为实参传递给相应的形参。
(1)向函数传递结构变量的成员
结构变量的成员作实参
结构变量的成员可以是普通变量,数组或指针变量,它们做实参时的情况同以前七,八,九章所讲。
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
35个字节
35个字节
35个字节
指向结构类型的指针变量:
如:struct student *pstd;
系统为该指针变量分配一个存放"地址"的4个字节的内存空间,具体该指针变量指向哪个结构类型变量,通过为该指针变量赋予某结构变量地址值来确定.
如下例:
struct student *pstd1,*pstd2,*pstd3;
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

九、结构体与共用体(一) 选择题1、C语言结构体类型变量在程序执行期间_________。

A.所有成员一直驻留在内存中B.只有一个成员驻留在内存中C.部分成员驻留在内存中D.没有成员驻留在内存中2、下面程序的运行结果是_________。

main(){struct cmplx{ int x;int y;}cnum[2]={1,3,2,7};printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);}A.0 B.1 C.3 D.63、设有如下定义:struct sk{int n;float x;}data ,*p;若要使p指向data中的n域,正确的赋值语句是_________。

A.p=&data.n;B.*p=data.n;C.p=(struct sk *)&data.n;D.p=(struct sk *)data.n4、以下对结构体变量stu1中成员age的非法引用是_________。

struct student{int age;int num;}stu1,*p;p=&stu1;A.stu1.ageB.student.ageC.p->ageD.(*p).age5、下面对typedef的叙述中不正确的是_________。

A.用typedef可以定义各种类型名,但不能用来定义变量B.用typedef可以增加新类型C.用typedef只是将已存在的类型用一个新的标识符来代表D.使用typedef有利于程序的通用和移植6、以下scanf函数调用语句中对结构体变量成员的不正确引用是_________。

struct pupil{char name[20];int age;int sex;}pup[5],*p;p=pup;A.scanf("%s",pup[0].name);B.scanf("%d",&pup[0].age);C.scanf("%d",&(p->sex));D.scanf("%d",p->age);7、若有以下说明和定义union dt{int a;char b;double c;}data;以下叙述中错误的是_________。

A)data的每个成员起始地址都相同B)变量data所占的内存字节数与成员c所占字节数相等C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000D)data可以作为函数的实参8、有一下语句struct s { int i1; struct s,*i2};static struct s a[3]={1,&a[1],2,&a[2],3,&a[3]},*ptr;ptr=&a[1];则一下表达式结果为3的是_________.A.ptr->i1++B. ptr++->i1C.*ptr->i1D. ++ptr->i19、C语言结构体类型变量在程序执行期间_________。

A.所有成员一只驻留在内存中B.只有一个成员驻留在内存中C.部分成员驻留在内存中D.没有成员驻留在内存中10、若定义了如下共用体变量x,则x所占用的内存字节数为_________。

union data{int i;char ch;double f;}x;A.7B.11C. 8D. 1011、在下面的叙述中,不正确的是_________。

A.枚举变量只能取对应枚举类型的枚举元素表中的元素。

B.可以在定义枚举类型时对枚举元素进行初始化。

C.枚举元素表中的元素有先后次序,可以进行比较。

D.枚举元素的值可以是整数或字符串。

12、设有类型说明"enum color {red,yellow=4,white,black};",则执行语句"printf("%d",white);"后的输出是_________。

A.5B.2C.1D.013、设有说明:struct{char name[15],sex;int age;float score;}stu,*p=&stu;以下不能正确输入结构体成员值的是_________。

A.scanf("%c",&p->sex);B.scanf("%s",);C.scanf("%d",&stu.age);D.scanf("%f",p->score);14、设有说明:union data{int i;float f;struct{int x;char y;}s;double d;}a;在16位PC环境下,int类型的整数占用两个字节,则变量a在内存中所占字节数为_________。

A.8B.17C.9D.1515、设有说明:struct {int x,y;}s[2]={{1,2},{3,4}}, *p=s,*q=s;则表达式++p->x和表达式(++q)->x的值分别为_________。

A.1 1B.1 3C.2 3D.3 316、以下说法中正确的是_________。

A.一个结构只能包含一种数据类型B.不同结构中的成员不能有相同的成员名C.两个结构变量不可以进行比较D.关键字typedef用于定义新的数据类型17、设有以下说明语句,则值为210的表达式是_________。

struct s{int a;int *b;};int x0[]={110,120},x1[]={210,220};struct s x[]={{100},{200}},*p=x;x[0].b=x0;x[1].b=x1;A.*p->bB.(++p)->aC.*(p++)->bD.*(++p)->b18、当说明一个结构体变量时,系统分配给它的内存是_________。

A.各成员所需内存量的总和。

B.结构体中第一个成员所需内存量。

C.成员中占内存量最大者所需的容量。

D.结构体中最后一个成员所需内存量。

19、把一些属于不同类型的数据作为一个整体来处理时,常用_________。

A. 简单变量B.数组类型数据C. 指针类型数据D. 结构体类型数据20、在说明一个联合体变量时,系统分配给它的存储空间是_________。

A.该联合体中第一个成员所需存储空间。

B.该联合体中占用最大存储空间的成员所需存储空间。

C.该联合体中最后一个成员所需存储空间。

D.该联合体中所有成员所需存储空间的总和。

21、在下面的叙述中,不正确的是_________。

A.枚举变量只能取对应枚举类型的枚举元素表中的元素。

B.可以在定义枚举类型时对枚举元素进行初始化。

C.枚举元素表中的元素有先后次序,可以进行比较。

D.枚举元素的值可以是整数或字符串。

22、下面程序的输出结果是_________。

main(){struct cmplx{int x;int y;}cnum[2]={1,3,2,7};printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);} A.0 B.3C.1D.623、若有如下说明:struct xx{int a;int b;};则_________是正确的应用或定义。

A.xx.a=5B.xx c;c.x=5C.struct c;c.x=5D.struct xx c={5}24、下面程序的输出结果是_________。

main(){struct cmplx{int x;int y;}cnum[2]={1,3,2,7};printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);} A.0 B.3C.1D.6(二)填空题1、以下程序的运行结果是_________.struct n{int x;char c;};main(){struct n a={10,'x'};func(a);printf("%d,%c",a.x,a.c);}func(struct n b){b.x=20;b.c='y';}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、以下程序的运行结果是_________.struct ks{int a;int *b;}s[4],*p;main(){int n=1;printf("\n");for(i=0;i<4;i++){s[i].a=n;s[i].b=&s[i].a;n=n+2;}p=&s[0];p++;printf("%d,%d\n",(++p)->a,(p++)->a);}4、结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。

请在_________内填入正确内容。

stati struct man{char name[20];int age;}person[]={"li=ming",18,"wang-hua",19,"zhang-ping",20};main(){struct man *p,*q;int old=0p=person;for( ;p_________;p++)if(old<p->age){q=p; _________;}printf("%s %d",_________);}5、以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点的指针(链表不带头结点)。

请在_________内填入正确内容。

struct link{char data ;struct link *next;};....struct link *p,*first;int c=0;p=first;while(_________){_________;p=_________;}6、以下程序运行后的输出结果是_________ 。

struct NODE{int k;struct NODE *link;};main(){ struct NODE m[5],*p=m,*q=m+4;int i=0;while(p!=q){p->k=++i;p++;q->k=i++;q--;}q->k=i;for(i=0;i<5;i++)printf("%d",m[i].k);printf("\n");}7、下面的程序输入学生的姓名和成绩,然后输出,请填空。

相关文档
最新文档