第十一章结构体与共用体
- 格式:docx
- 大小:28.38 KB
- 文档页数:10
第11章结构体与共用体一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。
)11.1 C语言结构体类型变量在程序运行期间A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元B)所有的成员一直驻留在内存中C)只有最开始的成员驻留在内存中D)部分成员驻留在内存中考生答案: 正确答案: B11.2 下列各数据类型不属于构造类型的是A)枚举型 B)共用型 C)结构型 D)数组型考生答案: 正确答案: A11.3 当说明一个结构体变量时系统分配给它的内存是A)各成员所需内存量的总和 B)结构中第一个成员所需内存量C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量考生答案: 正确答案: A11.4 设有以下说明语句typedef struct{ int n;char ch[8];} PER;则下面叙述中正确的是A)PER 是结构体变量名 B)PER是结构体类型名C)typedef struct 是结构体类型 D)struct 是结构体类型名考生答案: 正确答案: B11.5 已知有如下定义:struct a{char x; double y;}data,*t;,若有t=&data,则对data 中的成员的正确引用是A)(*t).data.x B)(*t).x C)t->data.x D)t.data.x 考生答案: 正确答案: B11.6 以下程序的运行结果是#include "stdio.h"main(){ struct date{ int year,month,day; } today;printf("%d\n",sizeof(struct date));}A)6 B)8 C)10 D)12考生答案: 正确答案: A11.7 设有如下定义:struck sk{ int a;float b;} data;int *p;若要使P指向data中的a域,正确的赋值语句是A)p=&a; B)p=data.a; C)p=&data.a; D)*p=data.a; 考生答案: 正确答案: C11.8 以下对结构体类型变量的定义中,不正确的是A)typedef struct aa{ int n;float m;} AA;AA tdl;B)#define AA struct aaAA { int n;float m;} tdl;C)struct{ int n;float m;} aa;struct aa tdl;D)struct{ int n;float m;} tdl;考生答案: 正确答案: C11.9 若有下面的说明和定义struct test{ int ml; char m2; float m3;union uu { char ul[5]; int u2[2];} ua;} myaa;则sizeof(struct test )的值是A)12 B)16 C)14 D)9考生答案: 正确答案: A11.10 以下程序的输出是struct st{ int x; int *y;} *p;int dt[4]={ 10,20,30,40};struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};main(){ p=aa;printf("%d\n",++(p->x));}A)10 B)11 C)51 D)60考生答案: 正确答案: C11.11 有以下程序:#include <stdio.h>union pw{ int i;char ch[2];}a;main(){ a.ch[0]=13;a.ch[1]=0;printf("%d\n",a.i);}程序的输出结果是A)13 B)14 C)208 D)209 考生答案: 正确答案: A11.12 已知学生记录描述为:struct student{ int no;char name[20],sex;struct{ int year,month,day;} birth;};struct student s;设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是A)year=1984;month=11;day=12;B)s.year=1984;s.month=11;s.day=12;C)birth.year=1984;birth.month=11;birth.day=12;D)s.birth.year=1984;s.birth.month=11;s.birth.day=12;考生答案: 正确答案: D11.13 有如下定义struct person{char name[9];int age;};struct person class[10]={"John",17,"paul",19,"Mary",18,"Adam",16,};根据上述定义,能输出字母M的语句是A)printf("%c\n",class[3].name);B)printf("%c\n",class[3].name[1]);C)printf("%c\n",class[2].name[1]);D)printf("%c\n",class[2].name[0]);考生答案: 正确答案: B11.14 下列程序的输出结果是struct abc{ int a, b, c, s; };main(){ struct abc s[2]={{1,2,3},{4,5,6}}; int t;t=s[0].a+s[1].b;printf("%d\n",t);}A)5 B)6 C)7 D)8考生答案: 正确答案: B11.15 若有下面的说明和定义,则sizeof(struct aa)的值是struct aa{ int r1; double r2; float r3;union uu{char u1[5];long u2[2];}ua;} mya;A)30 B)29 C)24 D)22考生答案: 正确答案: D11.16 有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。
11第十一章结构体与共用体结构体构体结的声、明结构变体的量义以及它定们的别区结构数组体的定义、初化始应及用向结指体变构以及量指结向构数组的指针体共用体声的明其及用引方式枚举型声明及其的用方式引户用自义定型类结构的定义体构结结体构的体应用结构体变量结体构组结数构指针体结构体变量结构体与类型的区别结构体与共体用共用体的定义共用体用共体量变共用的体应结构用与体共体用区的别共用体数组共用体指枚举针的义定枚举型户用自义定类型枚举应用共用的体量变与结构类型的体别区念的概导出实际应在用,常常需将中同不类型数的组合据一个成机的有整体这。
数据些是相联互的。
系一个如学生的有信息:关nmuna e msex ***** iL inmM aeg 18adrd Dalian若使用多个变量则它,之们无间系联;若使用组数,们又它是不一同类型。
必须一种新有数类型据,它既可容纳不同型类子的,又能项将子各项联成一体。
系就这是构体结型。
类数结构据描上述信述息。
什么是结体?构构体结是一组不类型同变的的量合。
集(这些量叫成员。
) 这变是C言语提的又供种一户自定义用、含的多种有型成类的员新类型是。
又一语言种级数据构。
结同不数于组的,是构结名体不字是再地址其;成组成员可以类型各不同相即不,等再小;大只有储是存连续的。
另,外每个成员拥都有己的存自储空间由。
是于型,所以不占用存储空类,间只而是给结体构量提供了变内布存局的模版。
构体结声的声明方明式:关键s字rutct结构名{ 新体型类结构名体员成表列类型块模} 一;要有分定号结构的体成可以员变量、数组、指针、甚是至其是它结体构量,变但们已它成组一个了可不分的整割。
体如例stru:c tstudnt e{char n ame20][ ;it idn f;lot chineaes ;lfat oenlisgh ;fola taeravg; };e结构体的储存模式ame[0n] //构结体名。
ch ar/结构体/成员1/ ../ d ini // .. ftoatlc ihens e/ /.. / /. otngeisl hveeagre float.结构体变量定的义结构体变量的定有义三方种:式1.声先明结构类型体再,定义该型类量:变trust ctsudnt setu1,stu;结构体类2名结构体变型量名如同:in于数据类t型a1a,2; 变名量样这便于修做,改便于使用。
第^一章结构体与共用体教学内容(1) 结构体的定义与结构体变量;(2) 结构体数组;(3) 结构体指针;⑷链表;(5) 共用体;(6) 枚举类型;基本要求掌握结构体的定义方法及其作用;重点掌握链表及其应用了解共用体的概念及其应用一、概述、引入原由我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。
有时需要将不同类型的数据组合成一个有机的整体,以便于引用。
这些组合在一个整体中的数据是互相联系的。
例如:学生的信息(姓名、性别、年龄、成绩、学号)。
那么如何实现这种结构呢?采用的是结构体。
女口:struct student{ int num;char n ame[20];char sex;int age;float score;};、结构体类型的一般形式struct 结构体名{成员表列};成员表列:类型名成员名女口:struct student{int nu m;char sex;};二、结构体类型变量的定义、引用、初始化、定义方法1、先声明类型再定义变量名struct stude nt{int nu m;char sex;};struct stude nt stu1,stu2;2、在声明类型的同时定义变量struct stude nt{int nu m;char sex;} stu1,stu2;3、直接定义结构体类型变量(不给出结构体名)struct{int nu m;char sex;} stu1,stu2;4、说明:1 )类型与变量不同(变量:分配空间,可以赋值、存储、运算)2)成员与普通变量地位相当,域名可以单独使用3)成员也可以是一个结构体变量如: struct date{int mon th;int day;int year;};struct stude nt{int num;char n ame[20];char sex;struct date birthday; }stu1,stu2;4) 成员名可以与程序中的变量名相同,二者不代表同一对象。
5) 结构体变量在内存中所占的大小为各成员所需内存量的总和。
二、结构体变量的引用1、只能对结构体变量中的各个成员分别进行输入和输出,不能将一个结构体变量作为一个整体进行输入和输出。
引用结构体变量中成员的方式为:结构体变量名•成员名。
女口:stu1.num=10001; ” "是成员运算符,优先级最高。
2、若成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级找到最低的一级的成员。
也就是说只能对最低级的成员进行操作。
3、对结构体变量成员可以像普通变量一样进行各种运算。
如:sum=stu1.score+stu2.score;4、可以引用结构体变量成员的地址,也可引用结构体变量的地址。
如scanf( %d, &stu. nu m);pirntf( %d', &stu1);三、初始化struct student stu仁{89031, "lilin ”,'m',123};三、结构体数组结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。
一、定义:与定义结构体变量的方法相仿如: struct student stu[3];在内存中存放情况(连续存放)、初始化struct stude nt {int num;}stu[3]={{……}, {……} , {……}};、举例对候选人得票的统计程序设有3个候选人,每次输入一个得票的候选人的名字,最后输出各人得票结果。
析:每个候选人都有姓名及票数,因此可以设计一结构体类型,又由于有 候选人,因此可设计一个结构体变量。
设投票10次。
NS 图四、结构体指针指向结构体变量的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。
指针变量也 可以用来指向结构体数组中的元素。
1、 定义方法同“指向一般变量的指针变量” 。
女口: struct student stu1;struct student *p;p=&stul;2、 赋值:将一个结构体变量的地址赋给一个结构体指针,即一个结构体指针指 向一个结构体变量。
如: p=&stu1;*p=stu1;3、 应用:struct stude nt{char name[20];int score;}stu1={ “ma lin ” ,90},*p;p=&stu1;引用只能对成员引用,而不能直接输出结构体变量。
可 printf( “%d ,stu1.score);也可用指针printf( “%d ,(*p).score);*p p 指向的结构体变量。
(*p ).score 表p 指向结构体变量中的成员 score 。
以下三种形式等价:结构体.成员名、(*P ).成员名、P — >成员名 指向结构体数组的指针以有表示说明:P2691、如果P的初值为Stu,即指向第一个元素,贝y P+1后指向下一个元素的起始地址。
2、程序已定义了指针P为指向struct student 类型数据的变量,它只能指向一个struct student 型的数据,而不能指向stu数组元素中的某一成员。
三、结构体变量和指向结构体的指针作函数参数1、用结构体变量的成员作参数。
用法和用普通变量作实参是一样的,属于“值传递”方式。
2、用结构体变量作实参。
采取的是“值传递”的方式,将结构体变量所占的内存单元的内容顺序传递给形参。
形参也必须是同类型的结构体变量。
在调用期间形参也要占用内存单元。
3、用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
若在被调用函数中改变了形参值,则该值会反映到主调函数中。
举例:struct stuent{int num;int score[2];};main (){void prin t(struct stude nt);struct stude nt stu;stu. nu m=1001;stu.score[0]=60;stu.score[1]=70;prin t(stu);}void prin t(struct stude nt stu){printf( “ %d%d%'d ,stu.num,stu.score[0],stu.scoje}改用指针实现struct stude nt{int num;int score[2];}stu={1001,60,70};main (){void prin t(struct stude nt *p);prin t(stu);}prin t(struct stude nt *p);{printf( “ %d%d%”>num,p->score[0],p->score[1]);}五、用指针处理链表1、链表的引入用同一数组先后存放不同班级的学生数据,则必须把数组定得足够大。
链表是根据程序的需要动态分配内存的一种数据结构。
2、链表的组成链表由各个元素组成,各元素又称为结点,第一个结点由头指针变量指向,每个结点都包含两个部分(一为用户需要用的实际数据,二为下一个结点的地址,链表中的最后一结点称为表尾,它的地址部分放一个" NULL”)链表到此结束。
3、链表在内存中的存放链表中各元素在内存中可以不连续存放,要找某一个元素必须找到上一个元素,根据它提供的下一元素地址才能找到下一元素,若不提供“头指针”,则整个链表都无法访问。
4、链表中结点的数据类型结构体变量,因为各成员的类型可以是指针类型。
、简单链表定义:所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放。
建立和输出阻抗一个简单链表,它由3个学生数据的结点组成。
#define NULL 0struct stude nt{Io ng num;float score;struct stude nt *n ext;};main (){struct stude nt a,b,c,*head,*p;a. num=9901;a.score=89.5;b. num=9903;b.score=90;c. num=9907;c.score=85;head=&a;a. next=&b;b.next=&c;c.next=NULL;p=head;do{printf( %ld%5.1f\n ",p->num,p->score);p=p->n ext;}while(p!=NULL);}Head a b c、处理动态链表所需的函数1、malloc 函数其函数原形:void *malloc( un sig ned int size);其作用:是在内存的动态区存储中分配n个长度为size的连续空间。
返回一个指向分配域起始地址的指针。
2、calloc 函数其函数原形:void *calloc( un sig ned n,un sig ned size);其作用:是在内存的动态区存储中分配n个长度为size的连续空间。
返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL3、free函数其函数原形:void free(void *p);作用是释放由P热量向的内存区,使这部分内存区能被其他变量使用。
P是最近一次调用calloc或malloc函数时返回的值。
四、建立动态链表从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相连的关系。
例:写一程序建立一个有3名学生数据的单向动态链表,每个结点包含有学号、分数项,当学号为9时,表输入结束Head=NULL,n =0开辟一个新结点,并使用p1,p2指向它读入一个学生数据给p1所指向的结点当p1->num!=0表尾结点的指针变量NULL,p2-> next=NULL p仁head输出p1->num,p1->scorep1=p1- >next当p1!=NULL#define NULL 0#defi ne LEN sizeof(struct stude nt)struct stude nt{long int num;int score;struct stude nt *n ext;};mai n(){int n=0;struct stude nt *head,*p1,*p2;head=NULL;p1=p2=(struct stude nt *)malloc(LEN); prin tf("Please in put datas:\n"); scanf("%ld%d",&p1-> num,&p1->score); while(p1- >num!=0) {n++;if(n==1) head=p1;elsep2->n ext=p1;p2=p1;p仁(struct stude nt *)malloc(LEN); sca nf("%ld%d",&p1-> num,&p1->score);}p1-> next=NULL;p仁head;do{printf("%ld ---- %d\n",p1-> num,p1->score);p1=p1- >n ext;}while(p1!=NULL);}五、对链表的删除操作要删的是第一个结点:head=p-> next要删的不是第一个结点:p2-> next=p1-> next六、对链表的插入操作在第一结点之前:head=pO;pO-> next=p1 在中间:p2-> next=pO;pO-> next=p1;在表尾:p1-> next=pO;pO-> next=NULL六、共用体、共用体的概念1、将几种不同类型的变量存放到同一段内存单元中。