分享

国二选择题题库参考答案

 不是小孩爱吃糖 2021-05-14

第三部分 参考答案

1.【答案】A

【解析】函数首部,函数声明中的形参与函数调用的实参是相匹配的。当实参为指针或数组名时函数首部或声明中的形参有三种形式:1*P2x[]3x[N]。所以本题选择A

2.【答案】B

【解析】B选项:当给两个相同类型的指针,赋同一个地址值,即表示两个指针指向同一个对象。所以B选项错

3.【答案】C

【解析】函数首部两个形参分别为整型和字符型。所以排除BDB中’97’语法错误,单引号里面只能是单个字符,D选项”a”是字符串,不是字符。由于函数首部为void,即无返回值。当函数无返回值时,不能把函数调用进行赋值给其他变量。A选项错误。

4.【答案】A

【解析】通过scanf()10.2赋值给x,3.5赋值给y

数据传递后,a=a-*pb=6.7*pb=*pb-a=3.5-6.7=-3.2

x传递值,形参不改变实参,x不会变。y传递是地址,在sub函数里通过指针操作y,达到改变y的目的。即传地址,地址指向的内容发生改变,实参就变。

所以x10.2y变为-3.2

5.【答案】D

【解析】a是二维数组名,p是行指针,是一个指针概念,并不是一个数级组,D选项错。p=a,即把第一行地址赋值给pp+i代表每行元素首地址,ABC正确。

6.【答案】C

【解析】数组下标从0开始,最大值是长度减1A错。定义说明数组时方括号中一定要是正的整型常量,B错。数组元素的下标只能是整型的量,D错。

7.【答案】A

【解析】,通过传递地址然后在函数中改变实参的值。传地址,地址指骨向的内容改变实参就变。那么在函数中sum应该加*,表示地址指向的值,即add。把以选择A

8.【答案】A

【解析】第3c数组定义为字符数组,不能赋值字符串。第4个定义d为字符,不能赋值字符串。

9.【答案】B

sum函数反回的是a+b-2

1次:sum(0,3),即把0传给a,3传给b。返回0+3-2=1

2次:sum(1,3),即把1传给a,3传给b。返回1+3-2=2

3次:sum(2,3),即把2传给a,3传给b。返回2+3-2=3

4次:sum(3,3),即把3传给a,3传给b。返回3+3-2=4

5次:sum(4,3),即把3传给a,3传给b。返回4+3-2=5

5次:i=5,i<5为假循环结束。s

10.【答案】B

【解析】

1次:do进入循环。传递ab。即可得b[0]等价a[0],b[3]等价a[3]。交换b[0]b[3],即交换a[0],a[3]。数组变为423156。然后i++i变为1

2次:i=1,i<2为真,进入循环,传a+1b。即可得b[0]等价a[1],b[3]等价a[4]。交换b[0]b[3],即交换a[1],a[4]。数组变为453126。然后i++i变为2

3次:i=2,i<2为真,进入循环,传a+2b。即可得b[0]等价a[2],b[3]等价a[5]。交换b[0]b[3],即交换a[2],a[5]。数组变为456123。然后i++i变为3

4次:i=3,i<3为假,循环结束,然后第从此for输出数组里面各元素。即456123

11.【答案】C

【解析】

在对一维数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0。本题程序执行过程为:调用change函数,函数作用是将数组每个元素加2

将数组array={1,2,3,0,0,0 }首地址传入函数,函数实现将数组每个元素加2arrray={3,4,5,2,2,2 }。依次输出数组前5个元素为3,4,5,2,2C选项正确。

12.【答案】B

【解析】sizeof()求所占内存大小。所有类型指针所占内存均为4个字节。

13.【答案】A

【解析】A选项除数i2开始,到被除数的a1/2为止。若a%i0,那说明a1a本身外的因子即不是素数。若a%i一直不0,说明没有1a本身外因子,即是素数。所以选择A

14.【答案】A

【解析】当指针为NULL时,说明指针没指向任何存储单元。既然没有指向任何储存单元也就无法给初值为NULL指向的存储单元读入数据。所以A错。

15.【答案】B

【解析】调用fun(a3),把数组首地址传给b,3传给nb[i]a[i]

每次循环给乘以b[i]。即r=b[0]*b[1]*b[2]*b[3]=2*3*4*5=120

16.【答案】D

【解析】二维数组初始化规则,能少不能多赋值。D选项是23列。但赋值有3个大括号,表示3行,超出定义的2行,故错。

17.【答案】C

【解析】

1次调用change函数,在change函数里面*data自加1,即data变为1。执行第一次输出data的值1

2次调用change函数,在change函数里面*data自加1,即data变为1变为2,然后返回2。随后通过赋值再赋值给data。第2次输出值为2

18.【答案】C

【解析】A选项,控制变量i没有依次加1,无法结束循环,也无法对整个数组赋值,输入的数全是a[0]A选项错误。B选项,第一个数据读入a[1],最后一次循环引用a[10],数组越界,B选项错误。C选项a为数组首地址,i++先取i值再加1scanf读入的数据依次存放在数组中,C选项正确。D选项数组元素引用错误,数组元素引用为[],不是()D选项错误。

19.【答案】A

【解析】

在对一维数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0。本题程序执行过程为:调用change函数,将数组array={2,3,0,0,0}首地址传入函数,函数实现将数组每个元素乘*2arrray={4,6,0,0,0}。输出为array[1]元素,即6

20.【答案】D

【解析】程序的执行过程为:定义数组m,并为其赋初值,数组长度为10。调用函数fun(m,6,3)将数组首地址传入函数,函数实现将数组下标值从63的元素依次向下标值大的方向移动三个位置,for循环结束之后数组为m={0,1,2,3,4,5,3,4,5,6}。依次输出数组元素,结果为0123453456D选项正确。

21.【答案】B

【解析】fun函数中当flag1,执行a[i]>a[j],flag0,执行a[i]<a[j]

for() for()  if()这种结构是排序的结构。

1次调用fun(c,10,1)c101分别传给a,n,flagflag1,执行a[i]>a[j],此时对数组进行从小到大排序。数组变为:1,2,3,4,5,6,7,8,9,10

2次调用fun(c,8,0)c80分别传给a,n,flagflag0,执行a[i]<a[j],此时对数组第1个到第8个元素进行从大到小排序。数组变为:8,7,6,5,4,3,2,1,9,10

然后输出数组各元素。

22.【答案】C

【解析】定义*ps[3],即ps3个元素的指针数组。ps[k]=s[k],将每行元素的首地址分别赋值给ps数组的三个元素。

*(ps[k]+1)s[k][1]。每次循环输出每行第2个元素。即246

23.【答案】D

【解析】p->iq->j。经过调用swap(p,q), a->ib->j。当在函数执行tp=a;a=b;b=tp;后交换指针指向:b->ia->j。再次执行*t=*a;*a=*b;*b=*t;ij的值发生交换。

此时输出*a,*b,即输出ji的值37

main()函数输出*p*q,即输出ij的值73

24.【答案】D

【解析】定义*p[3],即ps3个元素的指针数组。每次循环执行p[i]=a[i],将每行元素的首地址分别赋值给ps数组的三个元素。此时p[i]为每行元素首地址,可得*p[i]即是每行第一个元素。同时执行a[i][i]= *p[i]+2,表示将每一行第一个元素加2后赋值给对应行对角线上元素。a[0][0]=3, a[1][1]=4, a[2][2]=5;最后执行输出为对角线元素并且从a[2][2]开始,即选择D选项。

25.【答案】D

【解析】定义外*p等价于p指向的值。本题fun函数*data等价于main函数data

1次调用change函数,在change函数里面*data自加1,即data变为57。执行第一次输出data的值为57

2次调用change函数,在change函数里面*data自加1,即data变为57变为58,但r返回值是57(先用后加。)。随后通过赋值把返回的57再赋值给datadata重新变为57。第2次输出值为57

26.【答案】C

【解析】考查定义外,*p等价于指向的值。即*p等价xx=*p+10==x+10==110

27.【答案】A

【解析】第1个循环是把09分别赋值给a[0]--a[9]。第2个循环是求和。即把a[0]+0

a[1]+1a[2]+2a[3]+3相加赋值给k。结果为0+0+1+1+2+2+3+3=12

28.【答案】A

【解析】实参可以常量、变量、表达式或调用。形参与实参的个数、类型、顺序要一一匹配。形参只有传入数据才有值,所以不能是常量或表达式。

29.【答案】D

【解析】传地址,改变地址只是改变指针方向,实参并没有变。

当经过swap调用后交换ab的指向。交换后a指向jb指向i.1个输出*a,*b73。由于ij的值没变。那*p*q即对应ij的值。第2个输出为37

30.【答案】C

【解析】p是行指针,把二维数组名a赋值给p,那**p+i+j)即表示a[i][j]。每次循环即是求和。i0-2j0-1。求和项为a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]1+3+7+9+13+15==48

31.【答案】A

【解析】数组名a是地址常量,不能进行自加自减和赋值。选项语法错误。

32.【答案】D

【解析】D选项:定义外,*p等价于他所指向的值。但本题定义时没给指针p初始化,即p没指向任何储存单元。所以本题*p是不存在的。不能给不存在的变量赋值。D错。

33.【答案】D

【解析】有返回值的函数调用,均可以通过赋值号给变量赋值。无返回值的函数调用不能通过赋值给变量赋值。同时不论是否有返回值,函数调用均可作为独立语句出现。所以A对,D错。源程序由函数构成,不同的函数名不能相同,B对。同一函数中的形参名称要唯一,不同函数中名称可以相同,C对。

34.【答案】B

【解析】循环的嵌套,外层一次,内层一轮。

i=0,j=13时执行输出any[0+1]any[0+3]即输出37

i=2j=1时执行输出any[2+1],即输出7

选择B选项

35.【答案】A

【解析】f函数功能是返回两个指针指向较大的值。那么r=5。由于p->iq->j;所以*p等价i,*q等价j.最后输出结果为35355

36.【答案】A

【解析】当m=0n=n+*(*(p+m)+k)=0+x[0][1]=0+3

m=1, n=n+*(*(p+m)+k)=3+x[1][1]=3+11=14

37.【答案】D

【解析】fun函数中,当交换完下标为ij的元素后,执行i++,j--,然后继续交换,可得函数功能是将下标se的元素逆置。

1次调用fun(m,0,3)m是首地址。从第1个元素开始,逆置4个(0-3)元素。变为3210456789

2次调用fun(m+4,0,5)m+4是第5个元素开始,逆置6个(0-5)元素。变为3210987654

3次调用fun(m,0,9) m是首地址。从第1个元素开始,逆置10个(0-9)元素变为4567890123

38.【答案】B

【解析】每次调用传递ia,传递给b值都是4return a+b%2b%2=4%2=0,所以反回值也就a。即是i的值。i04执行循环。答案为01234

39.【答案】D

【解析】if(f1<*p)为真,把大值给f1if(f2>*p)为真,把小值给f2

每次循环都是把较大值赋值给f1,把较小值赋值给f2。当循环完f1是最大值,f2是最小值。选择D

40.【答案】A

【解析】可以通过指针引用相应的存储单元,即可以向相应的内存写入数据,A正确。不能直接向指针读入数据,指针要通过赋值获得地址值,B选项错。指针只能指向基类型相同的内存,C选项错。指针可以移动,可以比较,但指针相加减没意义,D选项错。

41.【答案】B

通过调用将i的地址给aj的地址给b*a*b分别等价于ij

1次:*a<*b,为真执行循环,*a自加1变为1*b自减1变为4

2次:*a<*b,为真执行循环,*a自加1变为2*b自减1变为3

3次:*a<*b,为真执行循环,*a自加1变为3*b自减1变为2

4次:*a<*b为假,执行getchar()!=@’,即’a’不等于’@’为真,执行循环体,*a自加1变为4*b自减1变为1

5次:*a<*b为假,执行getchar()!=@’,即’b’不等于’@’为真,执行循环体,*a自加1变为5*b自减1变为0

6次:*a<*b为假,执行getchar()!=@’,即’@’不等于’@’为假,结束循环。

最终*a*b分别为50,即ij分别为50

42.【答案】A

1次:k=0,调用fun(k)x=k=0y=x++y变为0。返回0.

main()函数输出fun(k)+k的值为0,同时执行k++,k变为1.进入下一次循环,for里面k++,k变为2.

2次:k=2,调用fun(k)x=k=2y=x++y变为2。返回2.

main()函数输出fun(k)+k的值为4,同时执行k++,k变为3.进入下一次循环,for里面k++,k变为4

3次:k=4,k<3为假,循环结束。

答案选B

43.【答案】D

【解析】形参只是形式存在,只有传入数据才有值,所以不能是常量或表达式,只能是一种合法的数据类型的变量,A对,D错。实参可以常量、变量、表达式或函数调用。在函数调用过程中形参与实参的个数、类型、顺序要一一匹配。BC正确。

44.【答案】B

【解析】通过fun调用传递,a[i]即是x[i]

a[1][i]即第2行元素。a[N-1][i]即第最后一行元素。第一个for循环即对第2行和最后一行元素求和。y=15+6+17+8+3+4+15+6=74

然后执行第二个for循环。每次执行a[i][i]= a[i][i]* a[i][i],即将对角线元素变为对应元素平方。a[0][0]a[1][1] a[2][2] a[3][3]分别变为1213612136

然后返回y的值74

输出主y , x[1][1]x[1][2]值分别为743617

45.【答案】D

【解析】双引号表示字符串,单引号表示字符,AB错误。空字符也就是空值用’\0’表示,C错误。D选项分别为十六进制和八进制转义字符,正确。

46.【答案】B

每次循环当*ptr0输出x,不为0输出’A+*ptrarray数组5个元素为53100。把前三次循环执行输出’A+5,’A+3,’A+1,即FDB,后两次循环*ptr都为0,执行输出两个XX。答案为B选项。

47.【答案】D

【解析】D选项中d定义为字符,不能给字符变量赋值字符串。

48.【答案】A

【解析】数组是一个集合的概念,并不能作为一个值来处理。而函数返回值只能是1个或0个。故A选项错。

49.【答案】A

【解析】调用函数,把12.6541122。分别传递给fun函数的sab

然后a=(int)(s),即强制转换为整数再赋值给aa变为11b=s-a=12.654-11=1.654.随后返回a+b=12.654

1个输出格式为%5.2f,表示5个宽度,2位小数。结果为12.65

由于本题传递是数值,形参不改变实参。实参ab不会改变。

2个输出ab的值,同时要保持5个宽度,2位小数,即11.0022.00

选择A

50.【答案】C

【解析】

第一个for循环。

1i=3,a[2]=3*2-1=5

2i=2a[1]=2*2-1=3

3i=1a[0]=1*2-1=1

while()循环

1i=0,x=2while(a[0]<2)为真,i++;,i变为1

2i=1,x=2while(a[1]<2)为假循环结束。

下一步将i赋值给pp变为1

第二个for循环:

1、当i=3,i>p为真执行a[3]=a[3-1]=5i—后i变为2a[3]=5

2、当i=2,i>p为真执行a[2]=a[2-1]=3i—后i变为1a[2]=3

3、当i=1,i>p为假循环结束。。

随后a[p]=x,即a[1]=2

最终数组变为a[0]=1; a[1]=2; a[2]=3; a[3]=5;

最后一个循环是输出各元素的值,选择C选项。

51.【答案】D

【解析】每个函数参数的数量在定义时已经确定。本题的两个参数分别是(exp1,exp2)与(exp1,exp2,exp3)这两个逗号表达式。

52.【答案】D

【解析】main()开始执行p->iq->j。通过调用函数传递后,a->ib->j。然后交换*a*b。即交换ij的值。i变为7j变为3

然后再交换ab,指交换两个地址,也就是交换指针方向,此时,a->jb->i,然后输出*a*b即输出ji的值分别为37

然后执行main()里面输出ij,*p,*q。即为7373

选择D选项。

53.【答案】A

【解析】使用库函数要加相应的预处理命令。

54.【答案】A

【解析】不管任何变量都要类型相同才能赋值,A对。P+1代表移动一个存储单元,单元大小由类型决定如类型为char表示1个字节,若为short表示2个字节。B选项错。p=0表示给指针赋空值,指不指向向任何内存,C错误。通过指针存取变量为间接存取。D选项错。

55.【答案】D

【解析】通过fun函数调用将6.5papb分别传递给xyz*ya,*zb.

*y=*y-1.0=2.5-1.0=1.5*z=*z+x=9.0+6.5。然后执行mian()里面输出a值,即fun函数*y的值1.5。由于%f默认6位小数,输出1.500000

56.【答案】D

【解析】所有指针均占4个字节内存。

57.【答案】D

【解析】数组初始化要保证赋值元素个不能超过数组大小。A选项第二个大括号内不能为空。选项B二维数组定义时列数不能省略。C选项内有3行,超过数组行数2

58.【答案】D

【解析】指针是地址变量,只能接受地址类型值,不能是其他类型的值。

59.【答案】A

【解析】函数首部,函数声明中的形参与函数调用的实参是相匹配的。当实参为指针或数组名时函数首部或声明中的形参有三种形式:1*P2x[]3x[N]。所以本题选择A

60.【答案】D

【解析】通过调用把a的值传给fun函数里面的a(int)a 强制转换为3x=a-(int)a=3.1415-3=0.1415。输出返回值0.141500

61.【答案】A

【解析】不管任何变量都要类型相同才能赋值,基类型不同的指针不能相互赋值,A选项错。

62.【答案】B

【解析】找最大最小值要对两个值先进比较,B对。A选项是对两个地址比较,C选项语法错误,数组中方括号内的值要是整型量,不能是地址。D选项是位置进行比较。

63.【答案】A

【解析】”ABC”字符串的长度是3再加上空值共为4,超过数C组大小2d定义为字符,不能级字符赋值字符串。ab定义正确。

64.【答案】D

【解析】通过函数传递地址,change函数里面的*data表示main函数里面data

1次调用,*data=*data%2=0。返回值为0+1,由于第一次调用change(&data)为独立语句,返回值没意义。然后在main输出data的值为0

2次调用*data=*data%2=0。返回值为0+1,然后在main函数把返回值赋值给data,即data=1。然后输出data值为1

65.【答案】A

【解析】c数组是字符数组,只能赋值多个字符或一个字符串,c定义不合法。d定义为字符,不能不赋值字符串,d也不合法。

66.【答案】D

【解析】

AB选项是逻辑运算,结果只有01,并不会是字母。C选项结果是对除以6597的余数。D选项rand函数随机产生一个值对26求余结果为0-25。这个余数加上大写A或小写a即是相应的大写或小写字母。

67.【答案】C

【解析】通过调用传递,fun函数里面n=10,x=10;

 a是首地址,p<a+n,表示p指向位置小于第10个位置。所以每次循环当指向的位置小于第10个位置并且p指向的值不为10时,p++即向后移动一个位置。最终p会指向第10个位置即p=a+9。然后if(p<a+10)为真执行返回p-a,即两个位置差为9

68.【答案】A

【解析】数组初始化时,未赋值的元素默认为0。数组各元素为{130}{500}{790}

下面嵌套的循环是输出数组各元素。外层一次,内层一轮。

i=2j=210。逆序输出第3行即097

i=1j=210。逆序输出第2行即005

i=0j=210。逆序输出第1行即031

结果选择A

69.【答案】A

【解析】B选项不能给指针赋值地址值之外的值。C选项只能限变量的地址。D选项,若取指针的地址,那即是二级地址,与基类型相同指针变量类型不一致不能相互赋值。

70.【答案】D

【解析】fun函数功能是若i为偶数a[i]=a[i]+ni为奇数a[i]=a[i]-n。即下标为偶数的元素加5,为奇数的元素减5a数组5个元素变为10-1-8-36

选择D

71.【答案】A

【解析】A选项pt是一个行指针。

72.【答案】A

【解析】fun函数第1个循环求a[0][1]+a[0][2]a[1][1]+a[1][2]a[2][1]+a[2][2]a[3][1]+a[3][2]之和,y=2+3+1+4+4+1+3+2=20

fun函数第2个循环求a[1][0]+a[2][0]a[1][1]+a[2][1]a[1][2]+a[2][2]a[1][3]+a[2][3]、之和然后再加到y,y=y+2+3+1+4+4+1+3+2=40

73.【答案】B

【解析】通过调用将首地址传给ss指向第一个元素。s[i]等价于a[i]s[1]=s[1]+6=8。即a[1]=8*s=7a[0]=7s=s+2s变为第3个元素地址,返回s赋值给pp为第3个元素a[2]的地址,*pa[2]

输出a[0]a[1]*P 分别为783

74.【答案】B

【解析】每次循环把比较大的元素地址赋值给*k。当所有循环结束后,下标为*k的元素即是最大值。fun函数*k等价于main函数里面k .题目输出ka[k],即输出最大值及其下标。

75.【答案】A

【解析】A选项中指针t没有初始化,不能给*t赋值,语法错误。

76.【答案】C

【解析】通过调用将a[1]地址传给ss指向a[1]。然后s=s+1s指向a[2]。此时s[i]等价于a[i+2]s[1]+=6a[3]=a[3]+6=10

*s+++=7,即将7加到*s上,即加到a[2]上,a[2]==a[2]+7=3+7=10.然后执行s++,指向a[3]。返回s即返回a[3]地址给p

输出a[1]2a[2]10*pa[3]值为10p[1]a[4]5

结果选择C

77.【答案】D

【解析】每次调用给b的值为14 C传的值均为2。不论i等于几,i*b%c均为0

78.【答案】B

【解析】NULL表示空值,空值ASCII码值为0

79.【答案】D

【解析】通过调用传递n=5

i%30执行a[i]=a[i]-n。当i%3不为0执行a[]=a[]=n

i=0a[0]=a[0]-5=1

i=1a[1]=a[1]+5=12

i=2a[2]=a[2]+5=13

i=3a[3]=a[3]-5=4

i=4a[3]=a[3]+5=15

80.【答案】D

【解析】函数调用,形参与实参的类型、个数、顺序要一一对应。A选项第一个参数类型不一致。BC选项二维数组列数不能省略。

81.【答案】B

【解析】第1次调用返回96195/10==9619。第2次调用返回9619/10=961。第3次调用返回961/10=96。最后输出96

82.【答案】C

【解析】f1返回3*3f2返回5*5

83.【答案】A

【解析】A选项二维数组列数不能省略。

84.【答案】A

【解析】pq分别指向ij。将pq传递给st*s*ti和是。f函数里面执行if(*s<*t)为真,将*t赋值给*si=j=5。然后ij都变为5。返回s也就是返回在i的地址。输出结果全是5

85.【答案】D

【解析】通过函数调用,将a值传递给fun函数里面的a。将b的地址递给s,此时a=3’,*s等价于mian里面b,值为’6’。执行temp=a=3’,a=*s=6’,*s=temp=3’。函数返回

形参a=6’并赋值给cc=6’。

a是传值 ,那么Main里面实参a不会变,还是’3’。b是传地址,*s等价b,即b=3’。

main输出a,b,c336

86.【答案】D

【解析】un函数中,当交换完下标为ij的元素后,执行i++,j--,然后继续交换,可得fun函数功能是逆置下标从n1n2的数组元素。

fun(p,0,3)即逆置前4个。数组变为4321567890

fun(p,4,9)即逆置下标49的元素。数组变为4321098765

fun(p,0,9) 即逆置下标09的元素数组变为5678901234

87.【答案】B

【解析】说明数组时方括号中是正的整型常量即可以,可以是1+4这种带运算符号的形式,AC错误。数组元素下标只能是整形或字符型,D错。

88.【答案】B

【解析】a[6-8/2]=a[2]=3

89.【答案】D

【解析】fun函数中当flag1,执行a[i]<a[j],flag0,执行a[i]>a[j]

for() for()  if()这种结构是排序的结构。

1次调用fun(c,5,1)c51分别传给a,n,flagflag1,执行a[i]>a[j],此时对数组进行从第1个元素开始到第5个从大到小排序。数组变为:10987351624

2次调用fun(c+5,5,0)c+550分别传给a,n,flagflag0,执行a[i]<a[j],此时对数组从第6个元素开始到第10个进行从小到大排序。数组变为:10,9,8,7,3,1,2,4,5,6

90.【答案】D

【解析】调用change函数,将数组array={1,2,0,0,0}首地址传入函数,函数实现将数组每个元素加2arrray={3,4,2,2,2}。依次输出数组前4个元素为3,4,2,2A选项正确。

91.【答案】A

【解析】通过指针引用变量为间接存取。

92.【答案】B

【解析】

p-a表示两个位置相减,由于把a赋值给p,所以p-a的值为0a[p-a]a[0]的值为11

p[i]等价于a[i]i=9p[i]a[9]的值为20

*&a[i])等价a[i]也为20

输出结果为112020

93.【答案】A

【解析】函数首部,函数声明中的形参与函数调用的实参是相匹配的。当实参为指针或数组名时函数首部或声明中的形参有三种形式:1*P2x[]3x[N]。所以本题选择A

94.【答案】A

【解析】p->iq->j。经过调用swap(p,q), a->ib->j。当在函数执行tp=a;a=b;b=tp;后交换指针指向:b->ia->j。再次执行*t=*a;*a=*b;*b=*t;ij的值发生交换。

此时输出*a,*b,即输出ji的值37

main()函数输出*p*q,即输出ij的值73

95.【答案】D

【解析】略

96.【答案】A

【解析】

1次调用test函数,在test函数里面*data自减1,即data变为11。执行第一次输出data的值11

2次调用test函数,在test函数里面*data自减1,即data变为10,然后返回10。随后通过赋值再赋值给data。第2次输出值为10

97.【答案】C

【解析】p存放a的地址,p指向a,即*p等价于a。给*p赋值10,即给a赋值。

98.【答案】D

【解析】数组a[10]10个元素均为0。把++i的值赋值给*p,即赋值给p指向的元素赋值。p每次自加2,本题对下标为偶数的每个元素加i+1。下标为奇数的元素不变。数组变为: 102030405

99.【答案】D

【解析】,传值,形参不改变实参。两次调用都不会改变a的值

100.【答案】B

【解析】考查传值与传地址的区别。

f3()函数传递 地址,然后在函数交换的是*a*b,即地址指向的值t1t2。然后t1变为Bt2变为A。输出BA

f2()函数同样是传地址,但交换的是地址,即只交换指针方向,并没有改为t1t2的值。输出AB

f1()函数t1传递地址,t2传递值。这样t2传值,形参不改变实参,t2的值 不变还为B。由于在f1函数执行了*a=b=B’。*at1t1变为。输出t1t2BB

101.【答案】B

【解析】array数组5个元素为22000change函数功能是将每个元素减1.5个数组元素变为11-1-1-1

102.【答案】B

【解析】循环嵌套。外层一次,内层一轮。

外层第1次:

i=0,首先进入内层第1for循环。

    1j=i=0,a[0][0]=a[4-0-1][0]=i+1;a[0][0]=a[3][0]=1

    2j=1a[0][1]=a[4-0-1][1]=i+1;a[0][1]=a[3][1]=1

3j=2a[0][2]=a[4-0-1][2]=i+1;a[0][2]=a[3][2]=1

4j=3a[0][3]=a[4-0-1][3]=i+1;a[0][3]=a[3][3]=1

5j=4,j<n-i为假for结束循环。

再进入第二个for循环

1k=i+1=1a[1][0]=a[1][3]=1;

2k=2,a[2][0]=a[2][3]=1;

3k=3k<n-1-i为假,循环结束

外层第2次:

i=1;第二次进入内层第1for循环。

    1j=1=1,a[1][1]=a[4-1-1][1]=i+1;a[1][1]=a[2][1]=2

2j=2,a[1][2]=a[4-1-1][2]=i+1;a[1][2]=a[2][2]=2

3j=3,j<N-i为假,结束循环。

再次进入内层第2for

1k=i+1=2;k<N-i-1为假,循环直接结束。

外层第3次:i=2,i<N/2为假,结束循环。

最终于数组变为 1 1 1 1

               1 2 2 1

               1 2 2 1

               1 1 1 1

输出a[1][i]即第2行。

103.【答案】A

【解析】函数每次将i2分别传给ab。返回a+b-2,即返回i+2-2的值为ii03。选择A

104.【答案】C

【解析】函数调用将m地址传给s.。然后在函数里面重新给s赋值k的地址,s指向k*s等价于*s=7,即k=7。此时执行输出m值不变。k是全局变量,也就是静态变量,输出k的值为改变之后的值。

答案为37

105.【答案】B

【解析】A少大括号,语法错,CD不是空函数。

106.【答案】A

【解析】函数声明中的数据类型、个数、顺序要与形参对应。题干中三个形参的类型分别是指针,指针,整型。A选项是三个整型,不匹配,错误。

107.【答案】B

【解析】A选项单纯定义数组不能省略数组大小。C选项初始化不能是一个空的大括号,必须有值。D选项三个大括号表示有三行超出定义数组的2行大小。

108.【答案】D

【解析】经过定义与初始化,q->p->a。可以得BC正确。*p等价于a。同埋*q等价于p,再同时两边加*号,**q等价*p,即**q*pa三个等价,A选项正确,D选项错。BC是变量

109.【答案】D

【解析】局部变量概念。定义在复合语句内的变量只在本复合语句范围有效,D错。

110.【答案】D

【解析】array数组4个元素分别是010ptr指向第一个元素。

第一次循环,if(*ptr==0)为真执行输出 #。然后Ptr++ptr指向第二个元素。

第二次循环, if(*ptr==0)为假执行else输出’M+1,N。然后Ptr++ptr指向第三个元素。

第三次循环, if(*ptr==0)为真执行输出 #。然后Ptr++ptr指向第四个元素。

答案为D

111.【答案】A

【解析】定义数组时方括号内的值必须是正的整型常量,A选项N是变量不可以。

112.【答案】B

【解析】fun函数中当flag1,执行a[i]<a[j],flag0,执行a[i]>a[j]

for() for()  if()这种结构是排序的结构。

1次调用fun(c,10,1)c101分别传给a,n,flagflag1,执行a[i]<a[j],此时对数组进行从大到小排序。数组变为:10,9,8,7,6,5,4,3,2,1

2次调用fun(c,5,0)c50分别传给a,n,flagflag0,执行a[i]>a[j],此时对数组里面第1个到第5个进行从大到小排序。数组变为:6,7,8,9,10,1,2,3,4,5

然后输出数组各元素。

113.【答案】A

【解析】A选项rand()%10000即随机产生一个09999的整数,然后再把这个随机数除以100.0即可以得到一个099.99的小数。

114.【答案】B

【解析】pk指向k,pm指向m,那*pk*pm即分别等价km

*(p=&n)=*pk*(*pm)p指向n。即前述表达式可等价n=k*m=8

115.【答案】B

【解析】p是行指针,执行p=a,即让p指向第1行元素。当i=0,输出(*p[0]即第1行第1个元素0,然后p++p指向第二行。当i=1, 输出(*p[1]即第2行第2个元素4,然后p++p指向第三行。当i=2, 输出(*p[2]即第3行第3个元素8,然后p++。当i=3,循环结束

116.【答案】B

【解析】题干数组是33列,第1123。第2456。第3700

A选项是33列,第1120。第2345。第3670

C选项是33列,第1123。第2450。第3670

D选项是33行,第1100。第2234。第3567

117.【答案】C

【解析】fun函数里面第一个循环功能是求第1列和第4列元素之和赋值给yy=20。第二个循环

i=1,y=y+a[0][1]+a[3][1]=20+2+3=25

i=2,y=y+a[0][2]+a[3][2]=25+3+2=30

118.【答案】D

【解析】循环嵌套外层一次,内层一轮。

i=0k=0,1,2。当i=1k=0,1,2

分别输出array[0][0]array[1][0]array[2][0]array[0][1]array[1][1]array[2][2]

值分别为102009

119.【答案】A

【解析】p1指向第1个元素,p2指向第2个元素。p2-p1为两个位置相减,位置差为5个存储单元。

120.【答案】A

【解析】fun函数功能是找到最小值并将最小值的下标赋值给midx。然后进入sawp,功能是将第1个元素和第midx个元素交换。即第1个和最小值交换。

每次循环都执行上述两个操作即实现每次都把小值往前放。这样可以实现从小到大将数组排序。

121.【答案】A

【解析】函数返回值类型由首部函数名前返回值类型决定。

122.【答案】D

【解析】可以通过强制转换改变指针的基类型。

123.【答案】C

【解析】AD选项错,数组下标只能是正的整型或字符型的量。B选项错,说明时方括号内的值是正的整型常量即可以,可以是1+2这样的表达式形式。

124.【答案】A

【解析】见第1题。

125.【答案】B

【解析】int *ptr[10],表示定义一个有10个元素的指针数组。长的有点像的int (*ptr)[10],表示定义ptr为一个行指针。

126.【答案】D

【解析】p是一个指针,若对P执行自加运算,指针向后移动一位,指向不确定内存,即会有安全隐患。ABC三个选项是对三个变量自加,无隐患。

127.【答案】B

【解析】fun函数中for()  for()  if()这种结构是排序的结构。

flag1,执行a[i]<a[j],从大到小排序。

flag0,执行a[i]>a[j],从小到大排序。

1次调用fun(c,10,0)c100分别传给a,n,flagflag1,此时对数组进行从小到大排序。数组变为:12345678910

2次调用fun(c,5,1)c51分别传给a,n,flagflag0,执行a[i]>a[j],此时对数组里面第1个到第5个进行从大到小排序。数组变为:54321678910

然后输出数组各元素。

128.【答案】B

【解析】A选项错,指针是一种变量,同一个内存即可以存放int类型指针也可以存放double类型的指针。C选项错,指针进行加乘除没有意义。D选项错,void类型指针表示无值的指针,不可以存取任何数据。

129.【答案】A

【解析】B选项可以使用1+2这样的常量表达式。方括号中的值要是正的整型的或字符型量。CD错。

130.【答案】D

【解析】数组名即首地址。

131.【答案】A

【解析】同117题。只是数组元素顺序有变化。

132.【答案】A

【解析】每次循环输出ptr指向的元素,然后p++,即向后指一位。循环三次,即输出前三个元素。

133.【答案】B

【解析】ptr指向a,那*Ptr等价于a*ptr=3,即将3赋值给a。然后执行a=(*ptr)++也就是执行a=a++。此时由于加号在后先用后加,先把a++的值3赋值给a,还是3,然后再自加1,a变为4。所以*ptra等价均为4

134.【答案】A

【解析】A选项只调用两次,相当于max等于括号里面逗号表达式的值,即getmax(c,d)的值getmax(c,d)返回的是cd里面的较大值。也就是说A选项只是cd这两个里面的最大值,并不是4个元素的最大值。

135.【答案】A

【解析】多个实参之前用逗号隔开。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多