结构体

 
结构体

第十二章 结构体

http:///
一、选择题

1.有以下程序段

typedef struct NODE

{ int num; struct NODE *next;

} OLD;

以下叙述中正确的是

A)以上的说明形式非法 B)NODE是一个结构体类型C)OLD是一个结构体类型 D)OLD是一个结构体变量

【答案】C

【解析】本题考查的是结构体的定义与typedef的用法。将题目中的定义语句去掉前面的typedef和后面的OLD(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,NODE是结构体名,大括号里面的是结构体成员的定义。此时要声明该结构体变量时需要使用struct加结构体名一起来声明,struct NODE一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体定义同时声明一个结构体变量OLD的语句,因为OLD的前面部分是struct NODE的完整写法,可以看作是struct NODE。C语言允许用typedef说明一种新类型名,其语法格式为: Typedef 类型名 标识符;以后就可以用该标识符来代替被说明的类型名了。因此,当前面存在typedef时,该语句就变成了给struct NODE的完整写法定义一个新的名称OLD。所以,此时的OLD是一个结构体类型,它相当于struct NODE,即可以和char一样单独用来声明该结构体变量,而NODE只是一个结构体名,不能单独用来声明变量。所以,4个选项中c符合题意。

2.有以下程序

#include <stdio.h>

struct STU

{ int num;

float TotalScore; };

void f(struct STU p)

{ struct STU s[2]={{20044,550},{20045,537}};

p.num = s[1].num; p.TotalScore = s[1].TotalScore;

}

main()

{ struct STU s[2]={{20041,703},{20042,580}};

f(s[0]);

printf("%d %3.0f\n", s[0].num, s[0].TotalScore);

}

程序运行后的输出结果是

A)20045 537 B)20044 550 C)20042 580 D)20041 703


【答案】D

【解析】本题考查的是结构体变量用作函数的参数。把结构体变量作为一个参数传递给函数时,传递的是实参结构体变量的值,系统将为结构体类型的形参开辟相应的存储单元。并将实参中各成员的值赋给对应的形参成员。因此,改变形参变量的内容不会影响实参,即传值调用。所以本题的函数f()没有对传递的结构体s[0]作任何改动,结果还是20041 703。应该选择D。

3.有以下程序

# include <stdio.h>

struct STU

{ char name[10];

int num; };

void f(char *name, int num)

{ struct STU s[2]={{"SunDan",20044},{"Penghua",20045}};

num = s[0].num;

strcpy(name, s[0].name);

}

main()

{ struct STU s[2]={{"YangSan",20041},{"LiSiGuo",20042}},*p;

p=&s[1]; f(p->name, p->num);

printf("%s %d\n", p->name, p->num);

}

程序运行后的输出结果是

A)SunDan 20042 B)SunDan 20044 C)LiSiGuo 20042 D)YangSan 20041

【答案】 A

【解析】本题考查的是指针用作函数参数。题目中定义的函数f()包含两个参数,一个字符指针,一个整型变量。当修改参数指针所指向的内容的时候,实参所指的内容也被修改,即传址调用:但只是修改参数变量的内容,则实参不受影响,即传值调用。因此,主函数调用 f()函数后,第1个参数被修改成函数中s[O]的name成员,第2个参数不受影响,还是主函数中s[1]的num成员。故最终输出SunDan 20042。应该选择A。

4.有以下程序

struct STU

{ char name[10]; int num; float TotalScore; };

void f(struct STU *p)

{ struct STU s[2]={{"SunDan",20044,550},{"Penghua",20045,537}}, *q=s;

++p ; ++q; *p=*q;

}

main()

{ struct STU s[3]={{"YangSan",20041,703},{"LiSiGuo",20042,580}};


f(s);

printf("%s %d %3.0f\n", s[1].name, s[1].num, s[1].TotalScore);

}

程序运行后的输出结果是

A)SunDan 20044 550 B)Penghua 20045 537 C)LiSiGuo 20042 580 D)SunDan 20041 703

【答案】B

【解析】本题考查的是结构指针用作函数参数。在主函数中,首先声明了一个结构体数组s[3],然后用数组名调用函数f,而数组名是数组首地址的指针,因此,传递给函数的是指向主函数中s[0]的指针。在函数中,将参数指针往后移动了一位++p;所以该指针现在指向主函数中的s[1],函数中也声明了一个结构体数组s[2]和一个结构体指针q,q虽然初始化指向函数中的结构数组s[2]的首地址,但也被往后移动了一位,所以函数调用的结果是将函数中的s[l]赋给了主函数中的s[1],故最终输出为:Penghua 20045 537,应该选择B。

(1) 5.设有以下语句

(2) typedef struct S

(3) { int g; char h;} T;

(4) 则下面叙述中正确的是()

(5) A)可用S定义结构体变量 B)可以用T定义结构体变量

(6) C)S是struct类型的变量 D)T是struct S类型的变量

【答案】B

【解析】本题考核的知识点是结构体类型定义和结构体的基本概念。结构体类型的定义格式为:

struct 结构体名

{成员说明列表);

结构体变量的定义有3种形式:第一种:定义结构体型的同时定义结构体变量如:strcut 结构体名 {成员说明列表}变量;第二种先定义一个结构体类型,然后使用该类型来定义结构体变量,如:struct student{成员说明列表}; struct student变量;第三种:定义一个无名称的结构体类型的同时定义结构体变量,如:struct {成员说明列表}变量。和上面三种情况比较我们不难得知只有选项B是正确的。所以,4个选项中选项B符合题意。

(7) 6.有以下程序

(8) struc STU

(9) {

(10) char name[10];

(11) int num;

(12) };

(13) void f1(struct STU c)

(14) { struct STU b={“LiSiGuo”,2042};

(15) c=b;

(16) }

(17) void f2(struct STU *c)


(18) { struct STU b={“SunDan”,2044};

(19) *c=b;

(20) }

(21) main( )

(22) { struct STU a={“YangSan”,2041},b={“WangYin”,2043};

(23) f1(a);f2(&b);

(24) printf(“%d %d\n”,a.num,b.num);

(25) } 执行后的输出结果是()

(26) A)2041 2044 B)2041 2043 C)2042 2044 D)2042 2043

【答案】A

【解析】本题考核的知识点是结构体类型的综合应用。本题中首先定义了一个结构体类型STU,它由一个字符数组和一个整型变量num组成。然后定义两个函数f1和f2。其中f1是值传递的,f2是地址传递的。主函数中定义两个结构体变量a和b计分别赋初值,接着调用函数f1(a),由于函数f1是值传递,故执行该函数后并没有改a 的值,在接着调用函数f2(&b),由于该函数是地址传递,执行该函数后将使变量b的值为{“SunDan”,2044},故函数最后输出的a.num和b.num的值为204l和2044。所以,4个选项中选项A符合题意。

(27) 7.有以下程序

(28) struct STU

(29) { char name[10];

(30) int num;

(31) int Score;

(32) };

(33) main( )

(34) { struct STU s[5]={{“YangSan”,20041,703},{“LiSiGuo”,20042,580},{“wangYin”,20043,680},

(35) {“SunDan”,20044,550},{“Penghua”,20045,537}},*p[5],*t;

(36) int i,j;

(37) for(i=0;i<5;i++) p[i]=&s[i];

(38) for(i=0;i<4;i++)

(39) for(j=i+1;j<5;j++)

(40) if(p[i]->Score>p[j]->Score)

(41) { t=p[i];p[i]=p[j];p[j]=t;}

(42) printf(“5d %d\n”,s[1].Score,p[1]->Score);

(43) } 执行后输出结果是()

(44) A)550 550 B)680 680 C)580 550 D)580 680

【答案】C

【解析】本题考核的知识点是结构体类型的定义、初始化以及结构体数组中元素的引用方法。本题中首先定义了结构体类型STU,该结构体由一个长度为lO的字符数组、两个整型变量num和Score组成。在主函数中,定义了一


个长度为5的结构体数组s并赋初值,一个指针数组p和一个指针变量t,接着将数组s中各元素的地址依次赋给指针数组p中的各成员。然后通过两个for循环将数组p按Score的值从小到大的顺序排列。因此最后输出的p[1]->Score的值为550,而数组s[l].Score的值为580,所以,4个选项中选项C符合题意。

(45) 8.有以下程序

(46) #include <stdio.h>

(47) struct NODE

(48) {

(49) int num;

(50) struct NODE *next;

(51) };

(52) main( )

(53) { struct NODE *p,*q,*r;

(54) int sum=0;

(55) p=(struct NODE *)malloc(sizeof(struct NODE));

(56) q=(struct NODE *)malloc(sizeof(struct NODE));

(57) r=(struct NODE *)malloc(sizeof(struct NODE));

(58) p->num=1;q->num=2;r->num=3;

(59) p->next=q;q->next=r;r->next=NULL;

(60) sum+=q->next->num;sum+=p->num;

(61) printf(“%d\n”,sum);

(62) } 执行后的输出结果是

(63) A)3 B)4 C)5 D)6

【答案】B

【解析】本题考核的知识点是链表中的基本操作。本题中定义了一个结点struct NODE,在主函数中定义了三个结点变量指针p、q和r,接着通过malloc函数分配了三个结点并让p、q和r分别指向他们,再接着给p、q和r所指向的结点的num域赋值为1、2、3,然后让结点p指向q,让q指向r,r指向NULL。显然q->next->num的值为指针r所指向结点的num域的值为3,p->num的值为指针p所指向结点的num域的值为1,故最后输出s的值为3+1=4。所以,4个选项中选项B符合题意。

9.若有以下说明和定义

bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。


TOP最近更新内容

    江苏省盱眙县都梁中学高中数学第2章平面向
    绿豆蛋花是怎样制作及具有什么样的功效?
  • 上一篇:施工现场临时厕所保洁制度
  • 下一篇:HACTL_Superterminal__Foster_Partners.pdf