结构体和共用体.docx
- 文档编号:30687848
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:21
- 大小:87.24KB
结构体和共用体.docx
《结构体和共用体.docx》由会员分享,可在线阅读,更多相关《结构体和共用体.docx(21页珍藏版)》请在冰豆网上搜索。
结构体和共用体
第十一章结构体和共用体
11.1本章基本知识结构
11.2知识难点解析
1.结构体与共用体变量在计算机中占用多少内存?
[解答]结构体变量所占的内存长度等于所有各成员的长度之和,每个成员分别占有自己的内存单元;共用体变量所占的内存长度等于最长的成员的长度。
2.结构体和共用体的有几种不同的引用方法?
[解答]结构体和共用体一样,有两种引用办法,一种是采用成员(分量)运算符“.”;还有一种是采用指针的办法。
下面以结构体为例说明这两种不同的引用的方法。
structstu
{intnum;
charname[10];
intage;
}zhangsan,*lisi;
要访问学生zhangsan年龄的办法有两种:
zhangsan.age或者(&zhangsan)
—>age;
要访问学生lisi年龄的办法也有两种:
(*lisi).age或者lisi—>age。
11.3习题
1.选择题
(1).以下程序运行的输出结果是()。
main()
{union{chari[2];
intm;
}r;
r.i[0]=2;r.i[1]=0;
printf("%d\n",r.m);
}
A.2 B.1 C.0 D.不确定
[分析、解答]答案为A。
本题涉及共用体的概念。
字符数组i[2]与整型变量m使用同一内存单元。
M占用2个字节,高字节对应i[1],低字节对应i[0],所以答案为A。
(2).有以下程序输出结果是()。
#include
structstu
{intnum;
charname[10];
intage;
};
voidfun(structstu*p)
{printf("%s\n",(*p).name);}
main()
{structstustudents[3]=
{{9801,"zhang",20},{9802,"Wang",19},{9803,"zhao",18}};
fun(students+2);}
A.Zhang B.Zhao C.Wang D.18
[分析、解答]答案为B。
在main函数中,定义结构体类型数组student[3],并赋初值。
即
student[0]={9801,〞zhang〞,20},
student[1]={9802,〞wang〞,19},
student[2]={9803,〞zhao〞,18},
调用子函数fun,实参“student+2”为student[2]的首地址,则p指向student[2]的首地址,(*p).name即“zhao”。
(3).有下列程序输出结果是()。
#include
main()
{union
{intk;
chari[2];
}*a,b;
a=&b;
a->i[0]=0x39;
a->i[1]=0x38;
printf("%x\n",a->k);
}
A.3839 B.3938 C.380039 D.390038
[分析、解答]答案为A。
题中a是指向共用体类型变量b的指针变量,整型变量k与字符数组i[2]共用。
一个存储单元,k的高位字节对应i[1],k的低位字节对应i[0].“0x39”表示十六进制数的39。
“%x”表示十六进制的格式输出。
(4).设有如下定义:
structnum
{inta;
floatb;
}data,*p;
若有p=&data;则对data中的a域的正确引用是()。
A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a
[分析、解答]答案为B。
p指向结构体类型变量data的首地址,*p即代表data,因此答案为B。
(5).若有下面的说明和定义,则sizeof(structaaa)的值是()。
structaaa
{intr1;
doubler2;
floatr3;
unionuuu
{charu1[5];
longu2[2];
}ua;
}mya;
A.30 B.29 C.24 D.22
[分析、解答]答案为D。
这是结构体套用共用体的形式,共用体的长度为8。
sizeof为长度运算符。
sizeof(structaaa)等价于sizeof(mya)=2+8+4+8=22。
(6).设有以下定义
typedefunion
{longm;
intk[5];
charch;
}DATE;
structdate
{intcat;
DATEcow;
doubledog;
}too;
DATEmax;
则语句printf(〞%d〞,sizeof(structdate)+sizeof(max)))的执行结果是()。
A.25 B.30 C.18 D.8
[分析、解答]答案为B。
本题用typedef声明新的类型名“DATE”来代替已有的类型名union。
sizeof是长度运算符。
max,cow都是共用体类型,长度为“intk[5]”的长度,即10。
所以:
sizeof(structdate)+sizeof(max)=(2+10+8)+10=30。
(7).字符ˊ0ˊ的ASCII码的十进制数为48,且数组的第0个元素在低位,则
以下程序的输出结果是()。
#include
main()
{union
{inti[2];
longm;
charc[4];
}r,*s=&r;
s->i[0]=0x39;
s->i[1]=0x38;
printf(〞%c\n〞,s->c[0]);
}
A.39 B.9 C.38 D.8
[分析、解答]:
答案为B。
“0x39”代表十六进制的39,即十进制的57,c[0]对应i[0]的低字节,由于十进制的57在内存中不超过8个二进制位(大于255不可),所以对应c[0]的就是57。
而字符0的ASCII码的十进制数为48,57就对应字符‘9’。
因此答案为B。
(8).若已建立下面的链表结构,指针p,s分别指向图中所示的结点,则不能将
所指的结点插入到链表末尾的语句组是()。
A.s->next=null;p=p->next;p->next=s;
B.p=p->next;s->next=p->next;p->next=s;
C.p=p->next;s->next=p;p->next=s;
D.p=(*p).next;(*s).next=(*p).next;(*p).next=s;
[分析、解答]:
答案为C。
s->next=p;p->next=s使得p,s所指的节点构成了环路而不是链表。
(9).根据下面的定义,能打出字母M的语句是()。
structstudent
{charname[9];
intage;
}
structstudentclass[10]={〞John〞,17,〞Paul〞,19,〞Mary〞,18,
〞Adam〞,16};
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];
[分析、解答]:
答案为D。
本题的要点是结构体成员的表示。
class[10]是结构体类型的数组,每个元素的长度是11,前9个字符型的放名字,后两个整型的放年龄。
A是指“Adam”。
B是指d。
C 是指a。
D指M。
(10).下列程序的执行结果为()。
structstr
{char*s;
inti;
structstr*sip;
}
main()
{staticstructstra[]={{"abcd",1,a+1},{"efgh",2,a+2},{"ijkl",3,a}};
structstr*p=a;inti=0;
printf("%s%s%s",a[0].s,p->s,a[2].sip->s);
printf("%d%d",i+2,--a[i].i);
printf("%c\n",++a[i].s[3]);
}
A.abcdabcdabcd20eB.abcdefghijkl20e
C.abcdabcdijkl20eD.abcdabcdabcd21e
[分析、解答]:
答案为A。
(11).下面程序的输出结果为()。
structst
{intx;
int*y;
}*p;
intdata[4]={10,20,30,40};
structstaa[4]={50,&data[0],60,&data[1],70,&data[2],80,&data[3]};
main()
{p=aa;
printf("%d\n",++p->x);
printf("%d\n",(++p)->x);
printf("%d\n",++(*p->y));
}
A.10B.50C.51D.60
20606070
20212131
[分析、解答]答案为C。
本题的说明中定义了一个名为st的结构体。
它由两个成员组成:
一个是整型变量x;一个是指针变量。
在定义的同时说明了一个指向这一结构类型的指针变量p.数组每个元素是一个含有两个成员的structst型的结构,并赋有初值。
在main函数中执行p=aa;语句后,p指向了数值的首地址,它们之间的关系如图所示:
.
p
10
aa[0].x
50
dt[0]
aa[0].y
.
20
aa[1].x
609
dt[1]
aa[1].y
.
30
aa[2].x
70
dt[2]
aa[2].y
.
dt[3]
40
aa[3].y
aa[3].x
.
80
这里需要注意运算符的优先级,对于题目中涉及的运算符()、—>、++、*,其中括号最优先,其次是指向结构体成员运算符—>,下来是自增运算符++和指针运算符*,它们属于同级运算,其结合方向是“自右至左”。
参照上图可知,第一条printf语句的输出项++px是先找出p(其值为50),再将其值自增1,取增值后的值,故输出51。
第二条printf语句的输出项为(++p)x,它表示先将指针p自增1,指向aa数组的第二个元素aa[1],然后取其第一个成员aa[1].x的值。
故输出为60。
第三次的输出项为++(*py)。
此时p已指向aa[1],因此输出项等价于++(data[1]),先取出data[1]的值(20),再将其增1,故输出21。
由此可见,答案C正确。
(12).设有以下语句:
structstudent{intn;structstudent*next;};
staticstructstudenta[3]={5,&a[1],7,&a[2],9,'\0'},*p;
p=&a[0];
则表达式()的值是6。
A.p++->nB.p->n++C.(*p).n++D.++p->n
[分析、解答]:
答案为D。
(13).下面程序的输出是()。
main()
{enumteam{a,b=4,c,d=c+10};
printf("%d%d%d%d\n",a,b,c,d);
}
A.0123B.04010C.04515D.14515
[分析、解答]答案为C。
根据C语言的语法规定,一旦定义了一个枚举类型,编译系统将按顺序为每个枚举元素分配一个对应的序号,序号值从0开始,后续元素的序号顺序加1。
此外,C语言也允许在定义枚举类型的同时人为地指定枚举元素的序号值,凡没有指定序号值的元素则在前一元素序号的基础上顺序加1。
由此可知,题中第一个枚举元素a的序号值为0;第二个元素b的序号值为4;第三个元素c的序号值为5;第四个元素d的序号值为15。
故本程序的输出结果应当是答案C。
(14).下面程序的输出是()。
main()
{structcmplx{intx;inty;}
num[2]={1,3,2,7};
printf("%d\n",num[0].y/num[0].x*num[1].x);
}
A.0B.1C.3D.6
[分析、解答]答案为D。
题中定义了结构体类型数组num,程序中已给出:
num[0].x的值是1,num[0].y的值是3,num[1].x的值是2.由于C语言中的运算符“/”和“*”优先级相同,且运算顺序从左至右,因此该程序应输出结果是6。
(15).下面程序的输出是()。
typedefunion{ longx[2];
inty[4];
charz[8];
}MYTYPE;
MYTYPEthem;
main()
{printf("%d\n",sizeof(them));
}
A.32B.16C.8D.24
[分析、解答]答案为C。
此题参考知识难点解析1。
2.填空题
(1).有以下定义和语句,则sizeof(a)的值是【1】,而sizeof(a.share)的值是【2】。
structdate
{intday;
intmonth;
intyear;
union
{intshare1;
floatshare2;
}share;
}a;
[分析、解答]答案为【1】10【2】4
本题的知识点是考察结构体、共用体变量占内存大小。
具体参考知识难点解析1
(2).若有以下说明和定义语句,则变量w在内存中所占字节数________。
unionaa
{floatx,y;
charc[6];
};
structst
{unionaav;
floatw[5];
doubleave;
}w;
[分析、解答]答案为34。
W的占内存大小sizeof(v)+sizeof(w[5])+sizeof(ave)=
6+4×5+8=34。
(3).有以下说明定义语句,可用a.day引用结构体成员day,请写出引用结构体成员a.day的其它两种形式【1】【2】。
{intday;
charmouth;
intyear;
}a,*b;
b=&a;
[分析、解答]答案为【1】(*b).day【2】b->day
具体参考知识难点解析2。
(4).为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向该结构的指针域,data用以存放整型数)请填空。
data next
structlink{chardata;(【1】)}node;
[分析、解答]答案为【1】structlink*next
本题的知识点是链表。
(5).变量root有如图所示的存储结构,其中sp是指向字符串的指针的指针域,nextp是指向该结构的指针域,data用以存放整型数。
请填空,完成此结构的类型说明和变量root的定义。
root
structlist
{
char*sp;
( 【1】)
( 【2】 )
}root;
[分析、解答]答案为【1】structlist*nextp【2】intdata
本题的知识点是链表。
(6).下列程序的执行结果为_______。
main()
{unionbt
{intk;
charc[2];
}a;
a.k=-7;
printf("%o,%o\n",a.c[0],a.c[1]);
}
[分析、解答]答案为177771,177777
本题的知识点是共用体的各成员共用一段内存。
(7).若有以下的说明、定义和语句,则输出结果为_______(已知字母A的十进制数为65)。
main()
{unionun
{inta;
charc[2];
}w;
w.c[0]='A';w.c[1]='a';
printf("%o\n",w.a);
}
[分析、解答]答案为60501。
本题考察知识点还是共用体的各成员共用一段内存。
W占2个字节的空间,第一个字节w.c[0]='A',即65,第二个字节w.c[1]='a',即97,整个2个字节的空间里分布的两进制数值是0110000101000001,八进制即60501。
(8).程序运行的结果是________。
main()
{unionexam
{struct
{intx;
inty;
}in;
inta;
intb;
}em;
em.a=1;em.b=2;em.in.x=em.a*em.b;em.in.y=em.a+em.b;
printf("%d,%d\n",em.in.x,em.in.y);
}
[分析、解答]答案为4,8。
(9).下面程序的输出结果是________。
structem
{inta;
int*b;
}
main()
{structems[4],*p;intn=1,i;
for(i=0;i<4;i++)
{s[i].a=n;
s[i].b=&s[i].a;
n=n+2;
}
p=&s[0];
printf("%d,%d\n",++(*p->b),*(s+2)->b);
}
[分析、解答]答案为25
(10).下面程序的输出结果是________。
#include
unionun
{inti;
charch[2];
}a;
main()
{a.ch[0]=13;
a.ch[1]=0;
printf("%d\n",a.i);
}
[分析、解答]答案为13
(11).若有以下的说明和语句,已知int类型占两个字节,则以下的输出结果为_______。
main()
{structst
{chara[10];
intb;
doublec;
};
printf("%d\n",sizeof(structst));
}
[分析、解答]答案为20。
本题的知识点是考察结构体、共用体变量占内存大小。
具体参考知识难点解析1
(12).若有以下的说明和语句,已知int类型占两个字节,则以下的输出结果为________。
main()
{unionun
{inti;
doubley;
};
structst
{chara[10];
unionunb;
};
printf("%d\n",sizeof(structst));
}
[分析、解答]答案为18
本题的知识点是考察结构体、共用体变量占内存大小。
具体参考知识难点解析1。
(13).下面程序的输出是_______。
main()
{enumem{em1=3,em2=1,em3};
char*aa[]={"AA","BB","CC","DD"};
printf("%s%s%s\n",aa[em1],aa[em2],aa[em3]);
}
[分析、解答]答案为DDBBCC。
题目所给枚举表中的枚举符em1和em2已通过赋值改变其值为3和1,而枚举符em3没有赋值,则其值为前面一个枚举符的值加1,即em3取值为2。
这样在printf语句中输出的将是以aa[3]、aa[1]和aa[2]为起始地址的字符串”DD”、”BB”和”CC”,考虑到输出格式控制中各字符串之间没有换行符,所以程序运行后其输出结果是DDBBCC.
7.4实验指导
1.实验目的
(1)掌握结构类型变量与数组的定义和使用;
(2)掌握使用结构指针和结构变量名使用结构成员的方法;
(3)掌握链表的基本概念和操作;
(4)掌握联合的概念与使用。
2.实验内容
编写程序并上机调试运行,做到充分理解程序的内涵。
(1).输入并运行下面程序,观察结果,分析联合变量的存储特点。
(2).有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩。
(3).下面的程序,构造一个如下图所示的三个结点的链表,并顺序输出链
表中结点的数据。
3.编程环境及程序代码
(1)编程环境:
TurboC2.0。
(2)程序代码
第一题:
#include
voidmain()
{
union
{inti[2];
longk;
charc[4];
}t,*s=&t;
s->i[0]=0x39;/*按照整型成员的类型赋值*/
s->i[1]=0x38;
printf("%lx\n",s->k);/*按照长整型成员的类型使用储存内容*/
printf("%c\n",s->c[0]);/*按照字符型成员的类型使用储存内容*/
}
第二题:
#include"stdio.h"
structstudent
{charnum[6];
charname[8];
intscore[3];
floatavr;
}stu[5];
main()
{inti,j,sum;
/*input*/
for(i=0;i<5;i++)
{printf("\npleaseinputNo.%dscore:
\n",i);
printf("stuNo:
");
scanf("%s",stu[i].num);
printf("name:
");
scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++)
{printf("score%d.",j+1);
scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].avr=sum/3.0;
}
}
第三题:
#include
structnode
{intdata;
structnode*next;/*指向本结点类型的指针是实现链
*/
};
voidmain()
{structnodea,b,c,*h,*p;/*定义三个结点h是头指
a.data=10;b.data=20;c.data=30;/*结点的数据赋值*/
h=&a;/*头指针指向a结
a.next=&b;/*a结点的指针指向b结点
b.next=&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用