结构体和共用体

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档