第四、五部分参考答案
第4节与第5节涉及到指针比较多,用文字描述比较难。大家以视频解析为准即可。这里提供参考答案
第4节 字符串、函数的递归、标识符的作用域和存储类
1-10:ACCAA DBACC
11-20:DBADD ADCAA
21-30:BBBCA DCAAA
31-40:ACDBB BADAA
41-50:DADAC ABCBC
51-60:ACBAA ADACA
61-70:DCAAC ABDDA
71-80:ACAAD CDDAA
81-90:CCCDA AABCA
91-100:ACCCC AACDA
101-110:ACACA BCAAC
111-120:BBAAD CACDA
121-135:ADABC DBAAA DDCDC
第5节 预编译处理、动态分配、结构体、位运算和文件
1、【答案】A
在本题中,p是指针,正确引用方式为p->name或(*p).name。
2、【答案】D
array五个元素分别是0,9,3,1,4。
for循环第一个if作用是把最大值赋值给res.first。第二个if作用是把最小值赋值给res.second。最后再将求和值赋值给res.third。然后通过ruturn返回给主函数,输出结果分别是最小值,最大值,和求和。
3、【答案】A
二级指针概念,二级指针即指向指针的指针,即存放地址的地址。c是普通变量,p是指向c的指针,q是指向p的指针即q是二级指针。
p=&c,是使p指向c。把q=&p,是使q指向p。
4、【答案】C
引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
C选项应该改为D选项形式,即(*a).n。即第三种形式。
5、【答案】C
通过void可知其返回值为空,即指针赋空值。当指针被赋空值时不能通过指针引用存储单元。因为指针指向空,本身就不存在。
6、【答案】D
f函数传递三个实参:b.name, &b.gender, &b.score均为地址,在f函数改变指针指向内容改变,实参即变。上课时总结为:传地址,地址指向内容(*p,a[i])发生改变,实参就变。所以b变量变为qian,f,350。
7、【答案】C
引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
由于ps是指针变量,所以C选项错。
8、【答案】C
函数功能,可以查看第12章概念。
9、【答案】A
程序要先编译再运行。但宏替换是在编译之前进行的预处理,所以不会占有运行时间。
10、【答案】A
引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
A选项中scanf数据列表应是地址。而ps是指针,d是数组名,那正确引用方式为ps->d。
11、【答案】A
【解析】本题结构体数组中,room是数组名,表示首地址指向第一个元素:{'Wang', 19},那么room+1指向第二个元素{'Li', 20}。题目要求输出room+1指向的name,room指向的age。即第二个元素姓名,第一个元素的年龄。
12、【答案】A
#define Memory(x,num) malloc(num*sizeof(x)
上述语句中,malloc是动态分配内存。num表示数量,sizeof表示每个内存的大小。此题表示分别给对应类型分配100个内存。
13、【答案】B
引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
在本题中rec是一个结构体变量,那么B选项错。应该采用上面三种方式中的第1种。
14、【答案】B
【解析】位运算与进制转换。位运算要转为二进制。y=010,是八进制数,转为二进制数形式是1000。执行y>>1表示位运算右移一位,即y>>1的值为二进制100,二进制100转为二进制为4。15、【答案】B
【解析】同14题考点相同都是位运算。a转为二进制是00000011,b转为二进制是0000110,a^b进行的是异或运算,运算法则是对应位相同为0不同为1。a^b=00000101。然后执行c=00000101<<2,即左移两位,即右边补2个0,得c=00010100,转为十进制是20。
16、【答案】D
【解析】同样考察位运算与进制转换。x转成二进制是00010000,y转为二进制是00000100。x>>=1即x=x>>1,右移一位,x变为00000100。y左移两位,得y值为00010000然后x^y异或运算,对应位相同为0不同为1。得x^y==00010100,由于%o表示不带前导的八进制,所以将00010100转为八进制为30。
17、【答案】C
【解析】宏替换,即文本替换。#define Out(x)n%2==0 ? '%c' : '%d'即当n为奇数时将out(x)替换为“%d”,即当n为偶数时将out(x)替换为“%c”。
第一次循环x=65,printf(Out(x),x)替换为printf(“%d”,x)输出65。
第二次循环x=66,printf(Out(x),x)替换为printf(“%c”,x)输出B。
第三次循环x=67,printf(Out(x),x)替换为printf(“%d”,x)输出67。
第四次循环x=68,printf(Out(x),x)替换为printf(“%c”,x)输出D。
所以选择C。
18、【答案】B
【解析】考察动态分配。p1=p2=(char*)malloc(sizeof(char)*10);通过mallo分配内存地址同时赋值给p1和p2。此时p1和p2指向同一内存空间。然后第一次通过strcpy(p1,'malloc');将“malloc'字符串放入所分配内存,第二次通过strcpy(p2,p1+1);将“alloc”放入所分配内存,由于放入的是同一个内存,第一次放的字符串会被第2次覆盖。此时内存中存放的是alloc字符串,那么不p1[0]和p2[0]都是表示内存的第一个元素a。
19、【答案】C
【解析】考察位运算。x转为十进制是00000011。y转为十进制是00000101。按位异或运算对应位相同为0,不同为1。刚x=x^y==00000110。y=x^y==00000011。x=x^y=00000101。最后转化为十进制是x=5,y=3。
20、【答案】B
【解析】考察位运算。a转为十进制是00001001。a右移3位(即a>>3)结果为00000001,转为十进制为1。但a的值并未变还是9。然后b=1%4==1。
21、【答案】A
【解析】考察位运算。即通过循环将数组的每一个元素与3进行按位与运算。5个元素分别是3,5,10,4,0。按位与的运算法则为对应位同时为1结果才为1。第一次循环:00000011&00000011==00000011,转化为十进制为3。其他几组用相同方法得到,1,2,0,0。
22、【答案】A
【解析】A选项fread作用是从文件中读取数据。只是读,并未输出。
B选项fwrite作用是从向文件内写入数据。
C选项fput作用是将字符ch写到文件指针fp所指向的文件的当前写指针的位置
D选项fprintf作用是按照格式装数据输出到文本文件中。
23、【答案】D
【解析】typedef作用是给已经有的类型另外取名。本题中将int *这个类型说明为T。那么把T *x[20]中的T换成int*得到结果是int **x[20]。D选项类型完全一样。
24、【答案】A
【解析】固定概念,位运算只能是整型或字符型数据。
25、【答案】C
【解析】位运算。x转为二进制为00000011,y转为二进制为00000101。按位异或对应位相同为0不同为1可得z1=x^y==00000110,转为十进制是6。z2=3+5=8。
26、【答案】D
【解析】程序的执行过程为:定义整型数组x1,x2并进行初始化,两个数组长度均为2。定义结构体数组x,并为其初始化,则x[0].a=1,x[0].b=x1,x[1].a=2,x[0].b=x2。输出x[0]的成员指针b指向的内存单元值,即数组x1的第一个元素3,输出x[1]的成员指针b指向的内存单元值,即数组x2的第一个元6。程序的运行结果是3,6,D选项正确。
27、【答案】A
【解析】recd数组共3个元素分别是:
srecd[0]=={{2016,3,5},{12,25,30}}
srecd[1]== {{2017,5,8},{8,45,55}}
srecd[2]== {{2015,6,8},{22,15,26}
每个元素的第一部分是年月日year,month,day,第二部分是时分秒hour,minute,second。
在for循环体中的if语句作用是如果年year>=2016则输出月和日。否则输出分和秒。
当i=1时:srecd[1].dt.year==2017>=2016为真,输出月和日即5-8。
当i=2时:srecd[1].dt.year==2015>=2016为假,输出分和秒即15-26。
所以答案选择A。
28、【答案】A
【解析】A选项中sanf()函数的数据列表部分必须是地址值。而p->age不是地址。正确方式是&(p->age)。
其他三个选项均是地址值。B选项name是数组名,为首地址。CD两个选项加了取地址符。
29、【答案】C
【解析】宏运算,运算法则是将所有都进行替换后再按照算术运算方式运算。
S(k+j+2)即k+j+2* k+j+2/k+j+2=6+3+2*6+3+2/6+3+2=29。
S(j+k+2)即j+k+2* j+k+2/ j+k+2=3+6+2*3+6+2/3+6+2=29。
30、【答案】B
【解析】位运算。先转二进制再进行运算。x转二进为00000011,y转二进制是00000101。
按位运算^相同为0不同为1。y^x==00000110,然后再收进行按位收运算,z1=00000110^00000101==00000011,转为十进制为3。按照同样方式运算可得z2=5。
31、【答案】B
【解析】array数组六个元素分别是19,21,3,4,0,0。
for循环第一个if作用是把最大值赋值给res.first。第二个if作用是把最小值赋值给res.second。然后通过ruturn返回给主函数,输出结果分别是最小值,最大值。
32、【答案】A
【解析】所有类型的指针所占内存均为4个字节,所以A选项正确。
33、【答案】C
【解析】带#号的预处理命令只是在编译前进行处理,但其位置可以不在最前面。
34、【答案】A
【解析】通过sturct S定义结构体变量s1,s2。然后分别给变量成员name数组赋值字符串“12345”,“ABC”。然后再将变量s2的值赋值给s1。此时s1结构体的成员name变为“ABC”。
35、【答案】A
【解析】main函数中b是指针,c是结构体变量。那么通过f(c,b)将变量c传递给a,将指针b传递给f函数的形参c。由于传值形参不改变实参,通过a=b并不会改变实参c的值。由于b传的是结构体成员name的地址。通过f函数里面面的for循环作用是将字符串小写转化为大写。所以本题只有name变成大写,其他值不变。
36、【答案】C
【解析】固定概念。
37、【答案】A
【解析】考查“逻辑与”和“按位与”的区别。
z1=x&&y中两边x、y均为真,那么z1的值为1。
z2=x&y,按位运算要先转二进制。x=00000100,y=00000010。按位与至应为均为1结果才为1。z2=00000100&00000010=000000000,转为十进制为0。
38、【答案】D
【解析】A选项fopen反回值为文件指针类型。B选项fopen调用形式为:fopen(文件名,文件使用方式)。C选项返回值为空表示未成功打开指定文件。ABC三选择错,D选项是fopen函数的作用。
39、【答案】A
【解析】考查位运算右移。ch转为二进制为00010000,右移一位结果为00001000,转为十进制的值为8。
40、【答案】A
【解析】引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
由于ptr是指针类型,所以A选项引用方式错误,正确形式应该是D选项。
41、【答案】D
【解析】函数固定用法。ABC三选项均可读入多个字符。getc和fgetc均是读入一个字符。
42、【答案】A
【解析】p指向a节点,将p->next赋值给pt,表示将a节点的指针域赋值给pt,即让pt指向b。p->next表示b的地址,p->nxet指向b,那么p->next->next即c的地址。把p->next=p->next->next;赋值给p->nxet表示让a节点指向c节点。然后释放(free)pt指针,表示pt不再指向任何内容。此时a直接指骨向c,即将b节点删除。
43、【答案】B
【解析】位运算要先转二进制。按位异或相同为0,不同为1。a=00000011^00000010==1。按位或对应位同时为0才为0。5|2=00000101|00000010==00000111,然后00000111|11110000==11110111,然后按拉取反(~),得00001000,转为十进制为8。
44、【答案】B
【解析】引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
由于rec是结构体变量。所以A选项引用方式错误,正确形式应该是B选项。
45、【答案】C
【解析】按位与,转为二进制,只有对应位同时为1结果为1。00000011&00000011==00000011,转为十进制为3。
46、【答案】D
【解析】“w”为写的方式打开文件,若文件存在,则从文件起始位置开始写入,若文件不存在则会新建指定文件名的文件。
47、【答案】D
【解析】宏运算,把所有的文本替换完后再进行运算。
S1(a+b,a+b)替换为a+b*a+b=3+4*3+4=19。
S1((a+b,(a+b))替换为(a+b)*(a+b)=(3+4)*(3+4)=49。
S2(a+b,a+b)替换为(a+b)*(a+b)=(3+4)*(3+4)=49。
48、【答案】A
【解析】结构体数组有5个元素,每个元素分为整数x和指针next两部分。通过for循环每次将下一个元素的地址赋值给前一个元素的指针域,即让第一个指向第二,第二个指向第三个,以此类推构成链表;并且每次将2*i+1赋值一给m[i].x。之前执行p=m,将首地址赋值给p,让p指向第一个元素m[i]。最后输出p++->x,由于p++的值是p,所以p++->x是第一个元素的x,即1。由于执行了P++,所以会指向第二个元素。然后输出p->x++,即2*1+1=3.
49、【答案】A
【解析】结构体数组有3个元素,每个元素有两部分分别为x,y。即data[0]={4,3}、data[1]={2,0}、data[2]={8,1}。每次循环输出第i个元素的x和第i个元素右移一位。
当i为0,输出41,
当i为1,输出20,
当i为2,输出80。
50、【答案】D
【解析】考查位运算。a转为二进制是00010000,右移4位结果是00000000,转为十进制是0,由于没有给a赋值,所以a的值还是16。然后0对1取余结果为0。
51、【答案】D
【解析】考查位运算。a转为二进制是000000001,右移4位结果是00000000,转为十进制是0,由于没有给a赋值,所以a的值还是1。然后0对3取余结果为0。
52、【答案】A
【解析】fread用法:fread(buffer,size,count,fp),第一个参数是内存块的首地址,A选项中第一个参数a[i]是一个数组元素,不是地址,所以是语法错误。
53、【答案】A
【解析】typedef作用是给已经有的类型另外取名。定义T b。可以认为b就是T。由于题目问题谁和b相同,那么只需要用a换掉T即可。
54、【答案】A
【解析】本质是考查函数数据传递。本题通过函数调用,将结构体变量a的地址传递给f函数里面的a.然后在f函数执行将结构体变量c的地址赋值给d,然后再赋值给a,此时形参a指向变量c。下面三个赋值语句其实就是把c变量赋值给a指向的变量即把c赋值给c。然后输出c的值。即sun,f,90。此时f函数执行结束,再输出main函数里面a的值。由于在f函数中,先将c的地址赋值给指针a,后面操作改变的都是变量c的值,并没有改变main里面a的值。所以a还是zhao,m,85.
可以总结为传地址,地址变,实参不变。
55、【答案】D
【解析】结构体变量中的成员可以是变量,可以是地址,可以是数组,同时也可以本结构体类的变量、指针、数组,不同成员之前要用分号隔开,同一个结构体中的成员不可同名,不同结构体中的成员可以同名。所以D选项是错的。
56、【答案】B
【解析】把结构体变量s2赋值给s1,那么s1变量里面的name成员就变成了字符串“ABC”。输出函数中%表示输出字符串,即本题输出ABC。
57、【答案】A
【解析】宏运算,把所有文本替换完再乾计算。
s(k+j)替换为(k+j/k+j)*k+j==(6+3/6+3)*6+3=57。
s(j+k)替换为(j+k/j+k)*j+k==(3+6/3+6)*3+6=39
58、【答案】C
【解析】在main函数定义两个结构体变量分别为a和b。ab两个变量分别有四个成员:name[9]、gender、score、next。在main函数中,先将b的地址赋值给a的指针域,即让a.next指向结构体变量b。调用f(a)即传递变量a给f函数的a,传值形参不改变实参,可知道main里面实参a的值不会变,还是zhao,m,85,所以在输出时,输出a结构体成员分别是zhao,m,85。在f函数中,又将d赋值给*a.next。所以a.next->name,a.next->gender,a.next->score三个即为d.name,d.gender,d.score结构体成员。即输出结果为:Li,m,100。
59、【答案】A
【解析】typedef是用户定义类型关键字,本题通过typedef将结构体struct Data说明为新的结构体类型名DATA,即DATA表示一个结构类型。
60、【答案】D
【解析】以“w”即写的方式打开文件都会从文件的起始位置开始写入内容,并且原来内容全部消失。本题每次循环均会首先执行一次打开文件,前一次写的内容都会消失,所以本题只需要考虑最后一次循环写入的内容。最后一次循环i=4,通过fputc写入的是’A’+4,即’E’。
61、【答案】D
【解析】固定用法。
62、【答案】A
【解析】固定用法。B选项错在有两个#。C选项错在替换文件不能是关键字。D选项define不能是大写。
63、【答案】C
【解析】考查位运算。将八进制的ch=020转为二进制为00010000,输出结果为左移1位,即00100000,转化为十进制为32。
64、【答案】A
【解析】用户定义类型,T *a可以认为T就是*a。那么把*a去替换掉T即得到A选项。
65、【答案】C
【解析】通过f函数将c变量的各成员分别赋值给a,然后通过return返回并赋值给main函数里面的变量b。由于定义变量a时是在函数外部定义的,所以a是全局变量,全部变量均为静态变量,所以在函数里面给a赋值,a的值即保留。所以本题main函数输出ab的各个成员均为f函数里面c变量成员值。
66、【答案】A
【解析】首先通过fopen打开文件,然后通过fprintf将a[0]即1写入文件的起始位置。然后每次进入循环后都先执行一次rewind(fp)那将指针重新移动到文件起始位置,然后再通过fprintf将a[i]写入指针所指向的起始位置。也就是每次循环都是向文件的起始位置写入数据,并覆盖上一次所写入的数据,最终文件写入的数据是a[5]即6。循环结束后rewind(fp)那将指针重新移动到文件起始位置,然后通过fscanf()从文件读取数值6并赋值给变量k。最终k的值为6。
67、【答案】B
【解析】A选项输出字符,C选项输出到文件,D选项向文件写入数据。而B选项是从文件获取数据。
68、【答案】A
【解析】宏名大小写均可,我们见到的多数是大写只是习惯问题,并不是说必须要大写。
69、【答案】A
【解析】位运算,将十六进制的0x0f转为二进制是00001111。将ch右移两位的结果为00000011。将ch左移4位为11110000。分别转化为十进制结果是3和240。
70、【答案】C
【解析】宏替换,所有文本替换完再运算。
D(i+j)宏替换为:4*i+j+1==4*2+4+1==13。
71、【答案】A
【解析】首先通过fopen打开文件,然后通过fwrite将a[0]即1写入文件的起始位置。然后每次进入循环后都先执行一次fseek(fp,0l,0)那将指针重新移动到文件起始位置,然后再通过fwrite将a[i]写入指针所指向的起始位置。也就是每次循环都是向文件的起始位置写入数据,并覆盖上一次所写入的数据,最终文件写入的数据是a[5]即6。循环结束后fseek(fp,0l,0)那将指针重新移动到文件起始位置,然后通过fread()从文件读取数值6并赋值给变量k。最终k的值为6。
72、【答案】A
【解析】B选项错,结构体变量只有在定义时才可以整体进行初始化。如果在定义后初始化只能单个成员进行赋值。C选项错,b是结构体变量,引用成员用b.name形式即可。D选项通过typedef将结构体说明为C。那么C即是一个结构体类型而不是结构体变量,把D错。
73、【答案】C
【解析】位运算与逻辑运算,13转为二进制是00001101,右移1位是00000110,然后与00000001进行按位或运算,对应位有一个为1结果就是1。所以00000110|00000001==00000111,转为十进制是7。||逻辑或,两边若有一个为真结果为1。00000110||00000001=1。
74、【答案】C
【解析】指向A节点,那么*P即是A节点,(*p).next即b节点的地址。(*p).next->next是即是b节点的指针域,b节点的指针域是指向c节点,所以*((*p).next->next)是c节点,那么如果表示c节点的dt部分,应该是:*((*p).next->next).dt。而不是A的形式。
75、【答案】C
【解析】通过f(a,&b)传递,将变量a和变量b的地址分别传递给形参的a,b。然后在f函数中将b指向的值即main里b的值赋值给形参a,再输出形参a的各个成员。即Qian,f,350,由于a传递的是地址,那么形参不改为实参,所以main里的实参a并不会变,还是原值。所以main里面输出Zhao,m,290。
76、【答案】A
【解析】逻辑或,只要有一个是真结果就为真。
77、【答案】D
【解析】c1转为二进制是00010010,c2转为二进制是00110110。按位与&,对应位同时为1结果为1,c1&c1结果为还是c1。按位异或^,对应位相同为0不同为1,所以c2||c2结果为0。
78、【答案】A
【解析】结构体成员引用,srud[0].name[3]是指Adum里面的第四个即m。
79、【答案】C
【解析】位运算,8转为二进制是00001000,然后右移两位是00000010,转为十进制是2,但并未给a赋值,所以a未变。然后执行b=2%2==0。所以输出ab值分别是8和0。
80、【答案】C
【解析】传地址,地址指向内容发生改变,实参就变。b传递的是地址值,然后在f函数中,给*b赋值,即给地址指向内容赋值,所以实参b会变为a的值。
81、【答案】A
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
本题中b传递的是地址值,然后在f函数中,将a的值给*b赋值和给c赋值,然后输出b和c结构体的各成员。即输出:Zhao,m,290,Zhao,m,290。由于f函数中给b指向内容赋值,所以实参b会变为a的值。而c传递的是变量值,所的c的值不会变。所以在main函数中输出b和c结构体的各成员。Zhao,m,290,Sun,m,370。
82、【答案】D
【解析】本题中定义了两个结构体变量1c1,pc2。分别给成员cpu赋值,然后再将pc2的值赋值给pc1。即pc1.cpu的值变为“????“
83、【答案】A
【解析】通过动态分配分配同一段内存的首地址赋值给p1和p2。此时p1和p2相等并指向是同一段内存的首地址。这段内存有5个int类型的空间。即可认为是一个有5个元素的数组。
在循环过程中,当i分别为0,1,2,3,4时,5个数组元素分别是0*10+1,1*10+1,2*10+1,3*10+1,4*10+1。最后输出p2-p1==0。*(p2+1)+*(p1+2)=10+21=32。
84、【答案】D
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
&input传递是地址,在change函数中改变的是data->name,即改变指向的内容,实参input会变为“****“。num传递的是值,所以形参不改变实参,即num还是4。
85、【答案】C
【解析】宏运算,所有文本替换完再运算。
S1(a+b)替换为4*a+b+4*(a+b)==4*1+2+4*(1+2)=18
S2(a+b)+S1(3)替换为4*(a)*(b)+b*x+4*3+4*(3)==4*(1)*(2)+2*1+4*3+4*(3)==34
S2(3+a,b+3) 替换为4*(3+a)*(b+3)+3+a*b+3==4*(3+1)*(2+3)+2+3*3+1=92
86、【答案】A
【解析】位运算,a转为二进制为00001000,然后右移三位结果为00000001,再转为十进制为1。但并未给a重新赋值所以a不会变。然后b=1*8=8。
87、【答案】A
【解析】A选项中已经用结构体定义了结构体变量PER,即PER已经是一个结构体变量,并不是类型,所以不能用来定义其他变量。
88、【答案】A
【解析】位运算,按位异或^,对应位相同为0不同为1。按位或,对应位有一位是1即为1。按位与对应位同时为1结果才为1。
根据以上规则,可得A选项。
89、【答案】D
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
本题中通过f函数调用,f(&b)传递的是地址,在f函数改变的是地址指向的内容,那么应该对应上面第2条。所以实参b会变为Qian,f,350。然后分别输出a和b的各成员。
90、【答案】B
【解析】不论任何类型的指针均是指针类型的变量。
91、【答案】C
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
本题中通过fun函数调用,fun(s[0])传递的是变量s[0],对应的是上面第3三种情况,所以实参s[0]不会变。
92、【答案】C
【解析】for循环作用是将最大值赋值给mx,并将最大值下标赋值给j,同时将最小值赋值给mn,并将最小值下标赋值给t。也就是说pd[j]是最大我是个,pd[i]是最小值。然后再将最大值赋值给pd[size-2]即pd[8]是最大值,同理pd[9]是最小值。main里面输出的是最大值结构体的data成员,即分别为“数据结构“和”计算机原理“。
93、【答案】A
【解析】概念,略。
94、【答案】D
【解析】a!b语法错误。
95、【答案】A
【解析】宏运算,将所有文本替换完再运算。
S1(a+b,a+b)替换为a+b*a+b=2+3*2+3=11
S1(b+a,b+a)替换为b+a * b+a =3+2*3+2=10
S2(a+b,a+b)替换为(a+b)(*a+b)= (2+3)*(2+3)=25
96、【答案】A
【解析】BC选项都是将第1个数据(个数)读入给datao数组。D选项由于先执行了i++,那么循环里面第一次给数组的a[1]读入数据,并未给a[0]读入数据。
97、【答案】A
【解析】通过fopen打开文件,然后再经过for循环将数组的5从个元素从最后一个开始写入文件,即写入文件的内容为6,5,4,3,2,1。再执行rewind将文件指针指向文件起始位置。然后再通过第二个for循环每次读取文件里面一个元素,并输出对应值。
98、【答案】D
【解析】fwrite()是从第一个参数开始读取,读第二个参数*第三个参数的乘积为个数。。ABC三个选项中第二和第三个参数相乘都是10,只有D选项相乘是1.所以D选项只读取了一个元素。
99、【答案】B
【解析】room数组有4个元素,room是数组名,即是首地址指向第一个元素room[0]。本题输出的是(room+2)->name表示第三个元素的name成员,(room+2)->age表示第一个元素的age成员。所以选择B。
100、【答案】B
【解析】宏运算,所有替换完再运算。HA*(HA+HB(2))可以替换为HA*(HA+(HA+1)*a)= 2*(2+(2+1)*2)=16。
101、【答案】D
【解析】用户定义类型。通过typedef struct{ int x,y; } *USER;将USER定义为结构体指针类型。
102、【答案】A
【解析】结构体成员中的name是数组名,所以(*p).name表示t结构体变量中的name数组的数组名,由于数组名是常量,不可给常量赋值,所以选项错。
103、【答案】D
【解析】A选项int是关键字不可用作用户标识符。B选项define不可大写,C选项多了一个#号。
104、【答案】A
【解析】固定概念,其代表内存块的首地址。
105、【答案】D
【解析】以w即写的方式打开文件时,若文件不存在系统将按照指定的文件名新建一个文件。新建文件后文件就已经存在,那么if为真,则输出“不能打开文件“。
106、【答案】A
【解析】BC选项多了一个#号。D选项int是关键字不可用作用户标识符。
107、【答案】C
【解析】typedef作用是给已经有的类型另外取名。定义T b。可以认为b就是T。由于题目问题谁和b相同,那么只需要用a换掉T即可。
108、【答案】C
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
本题中通过f(d)传递的是地址,由于执行了*a=*p,在f函数中改变是地址指向的内容,所以实参就变,并且执行了a->score[2]= a->score[0] + a->score[1],所以a->score[2]=95+96=191。所以两个输出均为huang,m,95,96,191。
109、【答案】D
【解析】结构体数组有两个元素,每个元素分别又有两个成员。即第一个元素为:{“c++”,36.0},第二个元素为:{“java”,23.59}。prog是数组名,为首地址,指向第一个元素,那么prog+1指向第二个元素。
题目要求输出的是第二个元素的name成员和第一个元素的price成员。即先输出java,然后再输出36.0。
110、【答案】A
【解析】考查位运算和逻辑运算。x转为二进制是00100100,将其右移两位得00001001,转为十进制是9。由于’A’
111、【答案】D
【解析】1、传地址,地址指向内容发生改变,实参就变。
2、传地址,地址指向内容发生改变,实参就变。
3、传值形参不改变实参。
本题通过fun(a,b,q)传递给fun函数的p1,p2,s。三个形参均是指针变量(地址)。在fun函数中首先通过动态分配给指针变量,即改变了地址值,符合上面第二条,所以实参不会变,还是初值。由于q在main函数中被赋空值,即q不指向任何内容。所以不能通过*引用其指向的内存单元。所以运算错误。
112、【答案】A
【解析】fwrite的第二个参数是每个数据的字节数,第三个参数书写次数。所以本题选择A。
113、【答案】A
【解析】B选项不能有两个#号。C选项define不能大写。D选项int是关键字,不用用作用户标志符。
114、【答案】B
【解析】固定概念。
115、【答案】B
【解析】宏运算是所有文本替换完了再进行运算。
S(k+j)替换为:k+j/ k+j* k+j=6+3/6+3*6+3=27。
S(j+k)替换为:j+k / j+k * j+k =3+6/3+6*3+6=29。
116、【答案】A
【解析】概念。略。
117、【答案】A
【解析】宏替换,即文本替换。#define Out(x)n%2==0 ? '%c' : '%d'即当n为奇数时将out(x)替换为“%d”,即当n为偶数时将out(x)替换为“%c”。
第一次循环x=65,printf(Out(x),x)替换为printf(“%d”,x)输出65。
第二次循环x=66,printf(Out(x),x)替换为printf(“%c”,x)输出B。
第三次循环x=67,printf(Out(x),x)替换为printf(“%d”,x)输出67。
第四次循环x=68,printf(Out(x),x)替换为printf(“%c”,x)输出D。
所以选择A。
118、【答案】D
【解析】引用结构体成员的三种正确方式:
结构体变量名.成员名
结构体指针变量名->成员名
(*结构体指针变量名).成员名。
由于stu是结构体变量。所以D选项引用方式错误,不应该用箭头表示。
119、【答案】D
【解析】A选项00000101|00001000=00001101,再转为十进制是14为真。
B选项8%5==3为真。C选项逻辑与两边同时为真,即为真。
D选项00000101&00001000=00000000转为十进制为0,即假值。
120、【答案】B
【解析】宏运算是将所有文本替换完再进行运算。本题中将PRINT( F(5)*2 )用PR(F(5)*2);putchar('\n')替换,将PR(F(5)*2)用printf('%d',(int)( F(5)*2))替换,再将F(5)用2.84+5替换,最后替换结果为printf('%d' ,(int)(2.84+5*2));putchar('\n'),运行结果为:12。B选项正确。
121、【答案】B
【解析】题目所说明结构体有两个成员,分别为整数num和结构体data,而结构体data又有三个成员。B选项中1001对应的是结构体的第一个成员。2008,8,1是结构体第二个成员即内存中的结构体,应作为一个整体来处理。所以1001不能单独括起来,2008,8,1可以作为一个整体括起来。
122、【答案】C
【解析】对文件进行写的操作最后一定要对文件进行关闭。否则会引起数据丢失。
123、【答案】A
【解析】本题结构体类型有两个成员,分别为x,y。并定义了结构体数组a,有两个元素分别为a[0],a[1]。a[0].y=3,a[0].x=4,a[1].x=2。输出结果是3/4*2==0。
124、【答案】C
【解析】FNA(FNB(a))先替换为FNA(a+a),再替换为a+a*a+a=2*2+2*2==8。
FNB(FNA(B))先替换为FNB(a*a),再替换为a*a+ a*a=4*4+4*4=32。
125、【答案】B
【解析】在main函数定义两个结构体变量分别为a和b。ab两个变量分别有四个成员:name[9]、gender、score、next。在main函数中,先将b的地址赋值给a的指针域,即让a.next指向结构体变量b。调用f(&a)即传递变量a的地址给f函数的形参a,然后通过赋值改变指针a指向的结构体成员,即改变指针指向的内容。对应main实参会变为Sun,f,90。在f函数中,又将d赋值给*a.next。所以a.next->name,a.next->gender,a.next->score三个即为d.name,d.gender,d.score结构体成员。即输出结果为:Sun,f,90,Li,m,100。
126、【答案】B
【解析】每次以w(写)方式打开res文件,都会将原有的内容覆盖。所以res文件中以最后一次写入为准。最后一次写入的是'K’+2==’M’。
127、【答案】B
【解析】m转为二进制是00100001,n转为二进制是01000010。
m=m^n=00100001^01000010==01100011
n=n^m=01000010^01100011==00100001转为二进制是33,
m=m^n=01100011^00100001==01000010转为二进制是66。
128、【答案】A
【解析】malloc是动态分配内存赋值给p,并不是p去申请内存,所以B错。分配的250个int类型的内存共250*4==1000个字节,正好是125个double类型的内存大小,经强制转换后可以用来存放double数组。
129、【答案】D
【解析】”wb”,“w+”,“w”三种写的方式打开文件时都会将文件原有内容覆盖,即原有内容会消失,所以不能实现信息补充的功能。
130、【答案】A
【解析】B选项define不可大写,C选项不可有两个#号,D选项char是关键字,不可用作用户标识符。
131、【答案】D
【解析】p指向a[0]。A选项(*p).n表示5。(*p).n++先加用后加,其值为5。
B选项P++先用后加。所以p++->n的值即p->n的值,也为5。
C选项->优先级高于++,所以p->n++可以理解为(p->n)++,值也为5。
D选项执行++p会使p指向第二个元素。那么(++p)的值也是第二个元素的地址。所以(++p)->n的值为6。
132、【答案】A
【解析】用户定义类型,给已经有的用户类型换个名。本题可以理解为将int *类型换个名为INTEGER,所以D选项错。所以INTEGER p可等价于int *p。所以p是基类型为int类型的指针,A选项正确,B选项错。INTEGER *q可以理解为int **q。q是基类型为int类型的二级指针。
133、【答案】A
【解析】位运算要先转为二进制。x转为二进制是00000100。
z1=x>>y,即将x右移两位得z=00000001转为十进制是1。z2=x<
134、【答案】D
【解析】题目已经将变量s2赋值给s1,所以s1中的name成员也变为“=”。
135、【答案】A
【解析】略。