结构体和共用体
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十一章结构体和共用体
11.1 本章基本知识结构
11.2 知识难点解析
1.结构体与共用体变量在计算机中占用多少内存?
[解答] 结构体变量所占的内存长度等于所有各成员的长度之和,每个成员分别占有自己的内存单元;共用体变量所占的内存长度等于最长的成员的长度。
2.结构体和共用体的有几种不同的引用方法?
[解答] 结构体和共用体一样,有两种引用办法,一种是采用成员(分量)运算符“.”;还有一种是采用指针的办法。下面以结构体为例说明这两种不同的引用的方法。
struct stu
{int num;
char name[10];
int age;
} zhangsan, *lisi;
要访问学生zhangsan年龄的办法有两种:zhangsan.age 或者(&zhangsan)
—>age;
要访问学生lisi年龄的办法也有两种:(*lisi).age 或者lisi—>age。
11.3 习题
1.选择题
(1).以下程序运行的输出结果是( )。
main()
{union {char i[2];
int m;
}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
struct stu
{int num;
char name[10];
int age;
};
void fun(struct stu *p)
{printf("%s\n",(*p).name);}
main()
{struct stu students[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
{int k;
char i[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).设有如下定义:
struct num
{ int a;
float b;
} 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(struct aaa)的值是( )。
struct aaa
{ int r1;
double r2;
float r3;
union uuu
{ char u1[5];
long u2[2];
}ua;
}mya;
A.30
B.29
C.24
D.22
[分析、解答] 答案为D。这是结构体套用共用体的形式,共用体的长度为8。sizeof 为长度运算符。sizeof(struct aaa)等价于sizeof(mya)=2+8+4+8=22。
(6).设有以下定义
typedef union
{ long m;
int k[5];
char ch;
} DATE;
struct date
{ int cat;
DATE cow;
double dog;
} too;
DATE max;
则语句printf(〞%d〞,sizeof(struct date)+sizeof(max)))的执行结果是( )。
A.25
B.30
C.18
D.8
[分析、解答]答案为B。本题用typedef声明新的类型名“DATE”来代替已有的类型名union。sizeof是长度运算符。max,cow都是共用体类型,长度为“int k[5]”的长度,即10。所以:sizeof (struct date)+sizeof(max)=(2+10+8)+10=30。
(7).字符ˊ0ˊ的ASCII码的十进制数为48,且数组的第0个元素在低位,则
以下程序的输出结果是( )。
#include
main()
{ union
{ int i[2];
long m;
char c[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分别指向图中所示的结点,则不能将
所指的结点插入到链表末尾的语句组是( )。
data next
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的语句是( )。
struct student