第十一章 结构体和共用体
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(\}
A.2 B.1 C.0 D.不确定
[分析、解答] 答案为A。本题涉及共用体的概念。字符数组i[2]与整型变量m使用同一内存单元。M占用2个字节,高字节对应i[1],低字节对应i[0],所以答案为A。
(2). 有以下程序输出结果是( )。
#include
char name[10]; int age; };
void fun(struct stu *p) {printf(\main()
{struct stu students[3]=
{{9801,\
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
a=&b;
a->i[0]=0x39; a->i[1]=0x38;
printf(\ }
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
{ 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
head E F NULL 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的语句是( )。
struct student
{ char name[9]; int age; }
struct student class[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). 下列程序的执行结果为( )。
struct str { char *s; int i;
struct str *sip; }
main()
{ static struct str a[]={{\struct str *p=a;int i=0;
printf(\printf(\printf(\}
A.abcd abcd abcd 2 0 e B.abcd efgh ijkl 2 0 e C.abcd abcd ijkl 2 0 e D.abcd abcd abcd 2 1 e [分析、解答]:答案为 A。
(11). 下面程序的输出结果为( )。
struct st { int x; int *y; } *p;
int data[4]={10,20,30,40};
struct st aa[4]={50,&data[0],60,&data[1],70,&data[2],80,&data[3]}; main() { p=aa;
printf(\printf(\printf(\}
A.10 B.50 C. 51 D.60 20 60 60 70