结构体与共用体
- 格式:doc
- 大小:75.50 KB
- 文档页数:12
第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)。
结构体和共用体数据:(1) 基本类型:整形字符型实型(2) 构造类型:数组结构体共用体理解:就是将不同类型的数据组成一个有机的整体。
一,声明结构体类型的一般形式:Struct 结构体名{成员表列;};二,定义结构体类型变量的方法:(1)先声明结构体类型在定义变量名:Struct student{成员表列;}Struct student student1,student2;(2)在声明类型的同时定义变量:Struct 结构体名{成员表列;}变量名表列;//student1,student2;(3)直接定义结构体变量:Struct {成员表列;注:即不出现结构体名;}变量名表列;注:成员也可以说一个结构体变量;例:Struct date{Int day;Int month;Int year;}Struct student {Int num;Char name[20];Char sex;Struct date birthday;//birthday是struct date类型}student1,student2;三,结构体变量的引用:形式:结构体变量名.成员名例:对变量的是赋值:student1.num=10020;如果成员本身又是一个结构体类型,则要用如干戈成员运算符从高向低级找例:student1.birthday.month;四,结构体的初始化Struct student{Int num;Char name[20];Char sex;Float score;} a={ 10101,”hashida”,’m’,89.0};结构体数组:简单理解就是结构体变量是一个数组;Struct student{} stu[3]={{ },{ },{ } } ;指向结构体类型数据的指针例:main (){struct student{long num;char name[20];char sex;float score;} ;Struct student stu;Struct student *p;P=&stu;Stu.num=10102;strcpy(,"tongyanming");Stu.sex=’m’;Stu.score=90.0;Printf(“%ld,%s%c%f”,stu.num,,stu.sex,stu.score); Printf(“%ld%s%c%f”,(*p).num,(*p).name,(*p).sex,(*p).score); printf("%ld %s %c %f\n",p->num,p->name,p->sex,p->score); Getch();}共用体定义形式:Union 共用体名{成员表列;}变量名表列;定义共用体变量的方法:(1)union date{int I;char ch;float f;}a,b,c;(2)(2) union date{int I;char ch;float f;};Union a ,b,c;注:共用体变量所占的内存长度是最长的成员长度引用 a.i,b.f;共用体变量不能初始化;。
结构体与共用体小结结构体和共用体是C语言中非常重要的数据类型。
它们在存储和组织数据方面提供了更灵活的选择。
本文将从定义、声明、初始化、使用和比较等方面对结构体和共用体进行详细讨论。
一、结构体(Struct)结构体是一种能够存储不同类型数据的自定义数据类型。
它允许将不同类型的数据组合在一起,形成一个逻辑上的实体。
1.定义和声明结构体的定义使用关键字`struct`,可以像定义其他变量一样定义结构体。
例如:```cstruct Studentint id;char name[20];int age;};```在定义结构体后,可以使用该结构体类型声明变量。
例如:```cstruct Student stu1;```也可以一步完成结构体类型定义和变量声明。
例如:```cstruct Studentint id;char name[20];int age;} stu1;```2.初始化结构体变量可以使用初始化列表初始化。
例如:```cstruct Student stu1 = {1001, "John", 20};```3.使用结构体变量的成员可以通过`.`运算符访问。
例如:```cstu1.id = 1001;strcpy(, "John");stu1.age = 20;```4.比较结构体不能直接比较,但可以通过定义比较函数来比较。
例如:```creturn (stu1.id == stu2.id && strcmp(, ) == 0 && stu1.age == stu2.age);```二、共用体(Union)共用体是一种特殊的数据类型,它允许不同类型的成员共享同一块内存空间。
共用体的成员在内存中是相互重叠的,只有一个成员可以被赋值和使用。
1.定义和声明共用体的定义使用关键字`union`,可以像定义其他变量一样定义共用体。
例如:```cunion Dataint i;float f;char str[20];};```在定义共用体后,可以使用该共用体类型声明变量。
第九讲结构体和共用体9.1 概述迄今为止,我们已经介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据——数组,数组中的各元素是属于同一个类型的。
但是只有这些数据型是不够的。
有时需要将不同类型的数据组合成一个有机的整体,以便于引用。
这些组合在一个整体中的数据是互相联系的。
例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项。
这些项都与某一学生相联系,如图。
应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。
C语言提供了这样一种数据结构,它称为结构体(structure)。
它相当于其它高级语言中的“记录”。
定义的类型如下:struct student{int num;char name[20];char sex;int age;float score;char addr[30];};上面定义了一个结构体类型,struct student(struct是关键字,不能省略),表示这是一个“结构体类型”。
它包括num,name,age,score,addr 等不同类型的数据项。
应当注意:struct student是程序设计者自己定义的类型名。
它和系统已定义了的标准类型(如int、char、float、double 等)一样可以用来作为定义变量的类型。
定义一个结构体类型的一般形式为:struct 结构体名{成员表列};花括弧内是该结构体中的各个成员(或称分量),由它们组成一个结构体。
例如,上例中的num,name,sex等都是成员。
对各成员都应进行类型说明,即类型标识符成员名也可以把“成员表列”称为“域表”。
每一个成员称为结构体中的一个域。
成员名命名规则与变量名命名规则相同。
“结构体”这个词是根据英文单词structure译出的。
许多C语言书把structure直译为“结构”。
9.2 结构体的定义、引用和初始化一、定义结构体类型变量的方法1、先定义结构体类型再定义变量名如:struct student{int num;char name[20];char sex;int age;float score;char addr[30];};struct student student1,student2;//表示定义两个struct student 类型的变量student1和student2.2、在定义类型的同时定义变量例如:struct student{ int num;char name[2];char sex;int age;float score;char addr[30];} student1,student2;它的作用与前面定义的相同。
结构体与共用体小结结构体与共用体小结一,结构体得概念与定义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、。
试卷编号:825所属语言:C语言试卷方案:结构体与共用体试卷总分:90分共有题型:5种━━━━━━━━━━━━━━一、填空共5题(共计10分)━━━━━━━━━━━━━━第1题(2.0分)题号:205结构体是不同数据类型的数据集合,作为数据类型,必须先说明结构体【1】,再说明结构体变量.答案:=======(答案1)=======类型第2题(2.0分)题号:208将函数funl 的入口地址赋给指针变量p的语句是【1】.答案:=======(答案1)=======p=funl;第3题(2.0分)题号:232设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud{ char num[6];int s[4];double ave;} a,*p;答案:=======(答案1)=======22第4题(2.0分)题号:345若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】".答案:=======(答案1)=======string.h第5题(2.0分)题号:803预处理命令行都必须以【1】号开始.答案:=======(答案1)=======#━━━━━━━━━━━━━━━━━二、单项选择共20题(共计40分)━━━━━━━━━━━━━━━━━第1题(2.0分)题号:464以下描述中,正确的是()。
A:预处理是指完成宏替换和文件包含中指定的文件的调用B:预处理指令只能位于C源文件的开始C:C源程序中凡是行首以#标识的控制行都是预处理指令D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C第2题(2.0分)题号:472下列程序运行结果为:#define P 3#define S(a) P*a*amain(){int ar;ar=S(3+5);printf("\n%d",ar);}A:192B:29C:27D:25答案:B第3题(2.0分)题号:488当定义一个结构体变量时,系统分配给它的内存是()。
A:各成员所需内存量的总和B:结构中第一个成员所需内存量C:结构中最后一个成员所需内存量D:成员中占内存量最大者所需的容量答案:A第4题(2.0分)题号:489设有如下定义:struct sk {int a; float b;} data,*p;若要使p指向data中的a域,正确的赋值语句是()。
A:p=(struct sk*)&data.a;B:p=(struct sk*) data.a;C:p=&data.a;D:*p=data.a;答案:A第5题(2.0分)题号:490以下对枚举类型名的定义中正确的是()。
A:enum a={sum,mon,tue};B:enum a {sum=9,mon=-1,tue};C:enum a={"sum","mon","tue"};D:enum a {"sum","mon","tue"};答案:B第6题(2.0分)题号:491在下列程序段中,枚举变量c1,c2的值依次是()。
enum color {red,yellow,blue=4,green,white} c1,c2;c1=yellow;c2=white;printf("%d,%d\n",c1,c2);A:1,6B:2,5C:1,4D:2,6答案:A第7题(2.0分)题号:545C程序中的宏展开是在()。
A:编译时进行的B:程序执行时进行的C:编译前预处理时进行的D:编辑时进行的答案:C第8题(2.0分)题号:546C语言中,定义结构体的保留字是()。
A:unionB:structC:enumD:typedef答案:B第9题(2.0分)题号:547结构体类型的定义允许嵌套是指()。
A:成员是已经或正在定义的结构体型B:成员可以重名C:结构体型可以派生D:定义多个结构体型答案:A第10题(2.0分)题号:548对结构体类型的变量的成员的访问,无论数据类型如何都可使用的运算符是()。
A:.B:->C:*D:&答案:A第11题(2.0分)题号:549相同结构体类型的变量之间,可以()。
A:相加B:赋值C:比较大小D:地址相同答案:B第12题(2.0分)题号:550使用共用体变量,不可以()。
A:节省存储空间B:简化程序设计C:进行动态管理D:同时访问所有成员答案:D第13题(2.0分)题号:551enum a {sum=9,mon=-1,tue};定义了()。
A:枚举变量B:3个标识符C:枚举数据类型D:整数9和-1答案:C第14题(2.0分)题号:552在定义构造数据类型时,不能()。
A:说明变量B:说明存储类型C:初始化D:末尾不写分号答案:D第15题(2.0分)题号:557若有int *p=(int *)malloc(sizeof(int));则向内存申请到内存空间存入整数123的语句为()。
A:scanf("%d",p);B:scanf("%d",&p);C:scanf("%d",*p);D:scanf("%d",**p);答案:A第16题(2.0分)题号:558若有int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则输出结果不为5的语句为()。
A:printf("%d",*(a+5));B:printf("%d",p[5]);C:printf("%d",*(p+5));D:printf("%d",*p[5]);答案:D第17题(2.0分)题号:562int (*p)[6]; 它的含义为()。
A:具有6个元素的一维数组B:定义了一个指向具有6个元素的一维数组的指针变量C:指向整型指针变量D:指向6个整数中的一个的地址答案:B第18题(2.0分)题号:563char *match(char c)是()。
A:函数定义的头部B:函数预说明C:函数调用D:指针变量说明答案:A第19题(2.0分)题号:571static struct {int a1;float a2;char a3;}a[10]={1,3.5,'A'};说明数组a是地址常量,它有10个结构体型的下标变量,采用静态存储方式,其中被初始化的下标变量是()。
A:a[1]B:a[-1]C:a[0]D:a[10]答案:C第20题(2.0分)题号:701以下叙述中不正确的是()。
A:预处理命令行都必须以#号开始B:在程序中凡是以#号开始的语句行都是预处理命令行C:C程序在执行过程中对预处理命令行进行处理D:以下是正确的宏定义#define IBM_PC答案:C━━━━━━━━━━━━━━━━三、程序填空共1题(共计10分)━━━━━━━━━━━━━━━━第1题(10.0分)题号:73/*-------------------------------------------------------【程序填空】---------------------------------------------------------功能:用结构体调用的方法编程。
要求输入A,B,C,D,E,F五个元素的数值,并按从大到小的顺序输出。
-------------------------------------------------------*/#include <stdio.h>#define N sizeof tbl/sizeof tbl[0] /*取得数组有多少个元素*/int A,B,C,D,E,F;struct ele{char vn;/***********SPACE***********/int 【?】;}tbl[]={{'A',&A},{'B',&B},{'C',&C},{'D',&D},{'E',&E},{'F',&F}},t;main(){int k,j,m;/***********SPACE***********/for(k=0;k<【?】;k++){printf("Enter data for %c\n",tbl[k].vn);scanf("%d",tbl[k].vp);}m=N-1;while(m>0){for(k=j=0;j<m;j++)/***********SPACE***********/if(*tbl[j].vp<【?】){t=tbl[j];tbl[j]=tbl[j+1];tbl[j+1]=t;k=j;}/***********SPACE***********/【?】;}for(k=0;k<N;k++)printf("%c(%d)",tbl[k].vn,*tbl[k].vp);printf("\n");}答案:=======(答案1)=======*vp=======(答案2)=======N=======(答案3)=======*tbl[j+1].vp=========或=========*tbl[ j + 1 ].vp=======(答案4)=======m=k━━━━━━━━━━━━━━━━四、程序改错共2题(共计20分)━━━━━━━━━━━━━━━━第1题(10.0分)题号:139/*------------------------------------------------------ 【程序改错】--------------------------------------------------------功能:下题是一段有关结构体变量传递的程序. ------------------------------------------------------*/#include <stdio.h>struct student{int x;char c;} a;f(struct student b){b.x=20;/**********FOUND**********/b.c=y;printf("%d,%c",b.x,b.c);}main(){a.x=3;/**********FOUND**********/a.c='a'f(a);/**********FOUND**********/printf("%d,%c",a.x,b.c);}答案:=======(答案1)=======b.c='y';=======(答案2)=======a.c='a';=======(答案3)=======printf("%d,%c",a.x,a.c);第2题(10.0分)题号:217/*------------------------------------------------------【程序改错】--------------------------------------------------------功能:用指针作函数参数,编程序求一维数组中的最大和最小的元素值.------------------------------------------------------*/#include <stdio.h>#define N 10/***********FOUND***********/void maxmin(int arr[ ],int *pt1, *pt2, n){int i;/***********FOUND***********/*pt1=*pt2=&arr[0];for(i=1;i<n;i++){/***********FOUND***********/if(arr[i]<*pt1) *pt1=arr[i];if(arr[i]<*pt2) *pt2=arr[i];}}main( ){int array[N]={10,7,19,29,4,0,7,35,-16,21},*p1,*p2,a,b; /***********FOUND***********/*p1=&a;*p2=&b;maxmin(array,p1,p2,N);printf("max=%d,min=%d",a,b);}答案:=======(答案1)=======void maxmin(int arr[ ],int *pt1,int *pt2,int n)=========或=========maxmin(int arr[ ],int *pt1,int *pt2,int n)=========或=========void maxmin(int *arr,int *pt1,int *pt2,int n)=======(答案2)=======*pt1=*pt2=arr[0];=========或=========*pt1=*pt2=*(arr+0);=========或=========*pt2=*pt1=arr[0];=======(答案3)=======if(arr[i]>*pt1) *pt1=arr[i];=========或=========if(*(arr+i)>*pt1) *pt1=arr[i];=========或=========if(*pt1<*(arr+i)) *pt1=arr[i];=========或=========if(*pt1<arr[i]) *pt1=arr[i];=======(答案4)=======p1=&a;p2=&b;━━━━━━━━━━━━━━━━五、程序设计共1题(共计10分)━━━━━━━━━━━━━━━━第1题(10.0分)题号:226/*------------------------------------------------【程序设计】--------------------------------------------------功能:编写函数实现两个数据的交换,在主函数中输入任意三个数据,调用函数对这三个数据从大到小排序。