union dt
{int a;char b;double c;}data;
以下叙述中错误的是______。
A)data的每个成员起始地址都相同
B)变量data所占的内存字节数与成员c所占字节数相等
C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000
D)data可以作为函数的实参
【答案】C
【解析】本题考查共用体的概念。共用体变量中的所有成员共享一段公共存储区,所以共用体变量所占内存字节数与其成员中占字节数最多的那个成员相等。本题定义的共用体中成员c所占的内存最多,因此选项B是正确的。由于共用体变量中的所有成员共享存储空间,因此变量中的所有成员的首地址相同,选项A是正确的。同结构体变量一样,共用体类型的变量可以作为实参进行传递,也可以传送共用体变量的地址,选项D也是正确的。在内存中,实数与整数的存放形式完全不一样,共用体的成员共用的是同一块内存,而不是同一个数值,因此选项C是错误的。
10. 有以下程序
typedef struct{int b,p;}A;
void f(A c) /*注意:c是结构变量名 */
{ int j;c.b+=1; c.p+=2;}
main( )
{ int i;
A a={1,2};
f(a);
printf("%d,%d\n",a.b,a.p);
}
程序运行后的输出结果是( )
A)2,3 B)2,4 C) 1,4 D)1,2
【答案】D
【解析】本题主要考查的是:结构体用作函数参数。结构体变量用作函数参数时,是将实参拷贝给被调用函数的形参,即传值。因此,本题中的f()函数对传入参数的修改不会影响到外面的实参,即a的内容还是{1,2},故本题应该选择D。
11.设有如下说明
typedef struct ST
{long a;int b;char c[2];}NEW;
则下面叙述中正确的是______。
A)以上的说明形式非法 B)ST是一个结构体类型
D)NEW是一个结构体变量 C)NEW是一个结构体类型
【答案】C
【解析】本题考查的是结构体的定义与typedef的用法。将题目中的定义语句去掉前面的typedef和后面的NEW(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,ST是结构体名,大括号里面的是结构体成员的定义。此时要声明该结构体变量时需要使用struct加结构体名一起来声明,struct ST一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体定义同时声明一个结构体变量NEW的语句,因为NEW的前面部分是struct ST的完整写法,可以看作是struct ST。C语言允许用typedef说明一种新类型名,其语法格式为:typedef 类型名 标识符;以后就可以用该标识符来代替被说明的类型名了。因此,当前面存在typedef时,该语句就变成了给struct sT的完整写法定义一个新的名称NEW。所以,此时的NEW是一个结构体类型,它相当于struct ST,
即可以和char一样单独用来声明该结构体变量,而ST只是一个结构体名,不能单独用来声明变量。所以,4个选项中C符合题。
12.有以下结构体说明和变量定义,如图所示:
struct node
{int data; struct node *next;} *p,*q,*r;
data next data next data next
现要将q所指结点从链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是______。
A)p->next=q->next;
C)p->next=r;
【答案】D
【解析】本题考查了链表的删除操作。要删除链表中间的某个结点,只需要使它的一个结点的next指针指向它的后一个结点。不过,严格来讲还需要使用free()函数释放掉该结点在内存中所占的空间。本题要删除的是q所指结点(以下简称q结点),只需使p结点的next指针指向r结点即可。选项A中,因为q结点的next指向r结点,所以执行p一>next=q一>next;语句后p结点的next就指向了r结点,故选项A能完成删除。选项B中,p一>next一>next等价于q一>next,因此也能完成删除。选项C直接让p一>next指向r结点,当然可以删除。选项D使指针p指向q一>next(即r结点),这样做不会影响到内存中的链表,所以应该选择D。
13.以下对结构体类型变量td的定义中,错误的是______。
A)typedef struct aa
{ int n; float m; }AA; AA td;
B)struct aa { int n; float m; }td; struct aa td; B)p->next=p->next->next; D)p=q->next; C)struct
D)struct { int n; { int n; float m; }aa; float m; }td; struct aa td;
【答案】C
【解析】本题考查的是结构体变量的声明。选项A使用typedef语句给结构体aa定义了一个新的名称AA,因此使用AA直接声明结构体变量td是正确的。选项B中,前面一句是定义结构体同时声明了结构体变量td,后一句是使用结构体名aa声明结构体变量td,都是正确的写法。选项C的第1条语句和选项D使用的是无名结构体直接声明变量的语法,是正确的,但是选项C的第2条语句使用已经声明的结构体变量aa来声明td是错误的。故应该选择C。
14.设有以下语句
typedef struct TT
{ char c; int a[4];} CIN;
则下面叙述中正确的是
A)可以用TT定义结构体变量
B)TT是struct类型的变量
C)可以用CIN定义结构体变量
D)CIN是struct TT类型的变量
【答案】C
【解析】本题考查的是结构体的定义与typedef的用法。将题目中的定义语句去掉前面的typedef和后面的CIN(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,TT是结构体名,大括号里面的是结构体成员的定义。此时要声明该结构体变量时需要使用struct加结构体名一起来声明,structTT一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体定义同时声明一个结构体变量CIN的语句,因为CIN的前面部分是struct TT的完整写法,可以看作是Struct TT。C语言允许用typedef说明一种新类型名,其语法格式为:Typedef 类型名 标识符;
以后就可以用该标识符来代替被说明的类型名了。因此,当前面存在typedef时,该语句就变成了给struct TT的定义一个新的名称CIN。所以,此时的CIN是一个结构体类型,它相当于struct TT,即可以和char一样单独用来声明该结构体变量,而TT只是一个结构体名,不能单独用来声明变量。所以,4个选项中C符合题意。
15. 以下关于typedef的叙述错误的是
a)用typedef可以增加新类型
b)typedef只是将已存在的类型用一个新的名字来代表
c)用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名
d)用typedef为类型说明一个新名,通常可以增加程序的可读性
【答案】A
【解析】本题考查的知识点是:typedef关键字。typedef关键字是用来给已有的类型起一个新的名字,以增加程序的可读性的。所以,通过typedef是不可能增加新的类型的,故应该选择A。
16.有以下程序
#include<stdio.h>
struct tt
{ int x;struct tt *y;}*p;
struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};
main( )
{ int i;
p=a;
for(i=1;i<=2;i++){printf("%d,",p->x);p=p->y;}
}
程序的运行结果是
a)20,30, b)30,17 c)15,30, d)20,15,
【答案】D
【解析】本题考查的知识点是:结构体数组。题目中定义了一个全局结构体数组a,结构体中包含两个成员:一个int型变量x和一个自身类型指针y。所以,结构体数组a的初始化列表中每两个初始化一个结构体元素.主函数通过一个for循环,连续调用了两次输出函数printf(),每次输出P所指元素的x成员值。P初始化时指向数组a的首地址,即a[0]的位置,所以第1次输出的值为20。然后又将a[0]的成员y的值赋给P,y在初始化时是a+l,所以P在第2次输出时指向的元素是a[1],故第2次输出的值为15。所以本题最终输出结果是“20,15,”,应该选择D。
17. 有以下程序
#include <stdio.h>
#include <string.h>
typedef struct{char name[9];char sex;float score[2];}stu;
stu f(stu a)
{ stu b={"zhao",’m’,85.0,90.0};int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)a.score[i]=b.score[i];
return a;
}
main( )
{ stu c={"qian",’f’,95.0,92.0},d;
d=f(c);
printf("%s,%c,%2.0f,%2.0f\n",d.name,d.sex,d.score[0],d.score[1]);
}
程序的运行结果是
a)qian,f,95,92 b)qian,m,85,90 c)zhao,m,85,90 d)zhao,f,95,92
【答案】C
【解析】本题考查的知识点是:结构体。本题的f()函数中,首先定义了一个STU结构体变量b并初始化为“{Zhao”,‘m’,85.0,90.O},然后分别通过strcpy()库函数、赋值语句和for循环,将b中所有成员分别赋给形参a的相应成员,最后返回a。所以,无论传递给函数fun()的参数是什么,结果返回的都会是函数中定义的STU结构体b的内容{“Zhao”,‘m’,85.0,90.0}。故最终输出结果为:Zhao,m,85,90,应该选择C。
18.设有以下定义
union data
{int d1;float d2;} demo;
则下面叙述中错误的是
a)变量demo与成员d2所占的内存字节数相同
b)变量demo中各成员的地址相同
c)变量demo和各成员的地址相同
d)若给demo.d1赋99后,demo.d2中的值是99.0
【答案】D
【解析】本题考查的知识点是:联合体。联合体的所有成员共占同一段内存,所以联合体变量的长度与它的最长成员所占长度一致,本题中float所占内存字节数为4,而int类型在TurboC 2.0中是占2字节、在VisualC++6.0中占4字节,所以int类型所占内存字节数不会超过float,那demo就与成员d2所占字节数是相同的,选项A的说法正确。联合体的所有成员的首地址都是相同的,和联合体变量的地址一致。故选项B和C都是正确的。由于int类型数据和float类型数据在内存中的存放格式是不一样的,所以给d1赋99后,d2中不会得到99.0这个值。故选项D不正确,答案应该选择D。
bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。