结构体和共用体

2018-12-20 22:40

第十一章 结构体和共用体

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 struct stu {int num;

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 main() {union {int k; char i[2]; }*a,b;

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 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

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


结构体和共用体.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《现代教育技术》201603考核

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: