国二选择题题库参考答案
第三部分 参考答案
1.【答案】A
【解析】函数首部,函数声明中的形参与函数调用的实参是相匹配的。当实参为指针或数组名时函数首部或声明中的形参有三种形式:1、*P。2、x[]。3、x[N]。所以本题选择A。
2.【答案】B
【解析】B选项:当给两个相同类型的指针,赋同一个地址值,即表示两个指针指向同一个对象。所以B选项错
3.【答案】C
【解析】函数首部两个形参分别为整型和字符型。所以排除BD,B中’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的目的。即传地址,地址指向的内容发生改变,实参就变。
所以x为10.2,y变为-3.2。
5.【答案】D
【解析】a是二维数组名,p是行指针,是一个指针概念,并不是一个数级组,D选项错。p=a,即把第一行地址赋值给p。p+i代表每行元素首地址,ABC正确。
6.【答案】C
【解析】数组下标从0开始,最大值是长度减1,A错。定义说明数组时方括号中一定要是正的整型常量,B错。数组元素的下标只能是整型的量,D错。
7.【答案】A
【解析】,通过传递地址然后在函数中改变实参的值。传地址,地址指骨向的内容改变实参就变。那么在函数中sum应该加*,表示地址指向的值,即add。把以选择A。
8.【答案】A
【解析】第3个c数组定义为字符数组,不能赋值字符串。第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进入循环。传递a给b。即可得b[0]等价a[0],b[3]等价a[3]。交换b[0],b[3],即交换a[0],a[3]。数组变为4,2,3,1,5,6。然后i++,i变为1。
第2次:i=1,i<2为真,进入循环,传a+1给b。即可得b[0]等价a[1],b[3]等价a[4]。交换b[0],b[3],即交换a[1],a[4]。数组变为4,5,3,1,2,6。然后i++,i变为2。
第3次:i=2,i<2为真,进入循环,传a+2给b。即可得b[0]等价a[2],b[3]等价a[5]。交换b[0],b[3],即交换a[2],a[5]。数组变为4,5,6,1,2,3。然后i++,i变为3。
第4次:i=3,i<3为假,循环结束,然后第从此for输出数组里面各元素。即456123。
11.【答案】C
【解析】
在对一维数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0。本题程序执行过程为:调用change函数,函数作用是将数组每个元素加2。
将数组array={1,2,3,0,0,0 }首地址传入函数,函数实现将数组每个元素加2,arrray={3,4,5,2,2,2 }。依次输出数组前5个元素为3,4,5,2,2。C选项正确。
12.【答案】B
【解析】sizeof()求所占内存大小。所有类型指针所占内存均为4个字节。
13.【答案】A
【解析】A选项除数i从2开始,到被除数的a的1/2为止。若a%i为0,那说明a有1和a本身外的因子即不是素数。若a%i一直不为0,说明没有1和a本身外因子,即是素数。所以选择A。
14.【答案】A
【解析】当指针为NULL时,说明指针没指向任何存储单元。既然没有指向任何储存单元也就无法给初值为NULL指向的存储单元读入数据。所以A错。
15.【答案】B
【解析】调用fun(a,3),把数组首地址传给b,3传给n。b[i]即a[i]。
每次循环给乘以b[i]。即r=b[0]*b[1]*b[2]*b[3]=2*3*4*5=120。
16.【答案】D
【解析】二维数组初始化规则,能少不能多赋值。D选项是2行3列。但赋值有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值再加1,scanf读入的数据依次存放在数组中,C选项正确。D选项数组元素引用错误,数组元素引用为[],不是(),D选项错误。
19.【答案】A
【解析】
在对一维数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0。本题程序执行过程为:调用change函数,将数组array={2,3,0,0,0}首地址传入函数,函数实现将数组每个元素乘*2,arrray={4,6,0,0,0}。输出为array[1]元素,即6。
20.【答案】D
【解析】程序的执行过程为:定义数组m,并为其赋初值,数组长度为10。调用函数fun(m,6,3)将数组首地址传入函数,函数实现将数组下标值从6到3的元素依次向下标值大的方向移动三个位置,for循环结束之后数组为m={0,1,2,3,4,5,3,4,5,6}。依次输出数组元素,结果为0123453456,D选项正确。
21.【答案】B
【解析】fun函数中当flag为1,执行a[i]>a[j],当flag为0,执行a[i]<a[j]。
for() for() if()这种结构是排序的结构。
第1次调用fun(c,10,1)把c、10、1分别传给a,n,flag。flag为1,执行a[i]>a[j],此时对数组进行从小到大排序。数组变为:1,2,3,4,5,6,7,8,9,10。
第2次调用fun(c,8,0)把c、8、0分别传给a,n,flag。flag为0,执行a[i]<a[j],此时对数组第1个到第8个元素进行从大到小排序。数组变为:8,7,6,5,4,3,2,1,9,10。
然后输出数组各元素。
22.【答案】C
【解析】定义*ps[3],即ps为3个元素的指针数组。ps[k]=s[k],将每行元素的首地址分别赋值给ps数组的三个元素。
*(ps[k]+1)即s[k][1]。每次循环输出每行第2个元素。即2,4,6。
23.【答案】D
【解析】p->i,q->j。经过调用swap(p,q), a->i,b->j。当在函数执行tp=a;a=b;b=tp;后交换指针指向:b->i,a->j。再次执行*t=*a;*a=*b;*b=*t;后i和j的值发生交换。
此时输出*a,*b,即输出j和i的值3,7。
main()函数输出*p和*q,即输出i和j的值7和3。
24.【答案】D
【解析】定义*p[3],即ps为3个元素的指针数组。每次循环执行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再赋值给data。data重新变为57。第2次输出值为57。
26.【答案】C
【解析】考查定义外,*p等价于指向的值。即*p等价x。x=*p+10==x+10==110。
27.【答案】A
【解析】第1个循环是把0—9分别赋值给a[0]--a[9]。第2个循环是求和。即把a[0]+0、
a[1]+1、a[2]+2、a[3]+3相加赋值给k。结果为0+0+1+1+2+2+3+3=12。
28.【答案】A
【解析】实参可以常量、变量、表达式或调用。形参与实参的个数、类型、顺序要一一匹配。形参只有传入数据才有值,所以不能是常量或表达式。
29.【答案】D
【解析】传地址,改变地址只是改变指针方向,实参并没有变。
当经过swap调用后交换a和b的指向。交换后a指向j,b指向i.第1个输出*a,*b即7和3。由于i和j的值没变。那*p和*q即对应i和j的值。第2个输出为3和7。
30.【答案】C
【解析】p是行指针,把二维数组名a赋值给p,那*(*(p+i)+j)即表示a[i][j]。每次循环即是求和。i从0-2,j从0-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是地址常量,不能进行自加自减和赋值。A 选项语法错误。
32.【答案】D
【解析】D选项:定义外,*p等价于他所指向的值。但本题定义时没给指针p初始化,即p没指向任何储存单元。所以本题*p是不存在的。不能给不存在的变量赋值。D错。
33.【答案】D
【解析】有返回值的函数调用,均可以通过赋值号给变量赋值。无返回值的函数调用不能通过赋值给变量赋值。同时不论是否有返回值,函数调用均可作为独立语句出现。所以A对,D错。源程序由函数构成,不同的函数名不能相同,B对。同一函数中的形参名称要唯一,不同函数中名称可以相同,C对。
34.【答案】B
【解析】循环的嵌套,外层一次,内层一轮。
当i=0,时j=1和3时执行输出any[0+1]和any[0+3]即输出3和7。
当i=2时j=1时执行输出any[2+1],即输出7。
选择B选项
35.【答案】A
【解析】f函数功能是返回两个指针指向较大的值。那么r=5。由于p->i,q->j;所以*p等价i,*q等价j。.最后输出结果为3,5,3,5,5。
36.【答案】A
【解析】当m=0,n=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函数中,当交换完下标为i和j的元素后,执行i++,j--,然后继续交换,可得函数功能是将下标s到e的元素逆置。
第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
【解析】每次调用传递i给a,传递给b值都是4。return a+b%2;b%2=4%2=0,所以反回值也就a。即是i的值。i从0到4执行循环。答案为01234。
39.【答案】D
【解析】if(f1<*p)为真,把大值给f1。if(f2>*p)为真,把小值给f2。
每次循环都是把较大值赋值给f1,把较小值赋值给f2。当循环完f1是最大值,f2是最小值。选择D。
40.【答案】A
【解析】可以通过指针引用相应的存储单元,即可以向相应的内存写入数据,A正确。不能直接向指针读入数据,指针要通过赋值获得地址值,B选项错。指针只能指向基类型相同的内存,C选项错。指针可以移动,可以比较,但指针相加减没意义,D选项错。
41.【答案】B
通过调用将i的地址给a,j的地址给b。*a和*b分别等价于i和j。
第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分别为5和0,即i和j分别为5和0。
42.【答案】A
第1次:k=0,调用fun(k),x=k=0。y=x++,y变为0。返回0.
main()函数输出fun(k)+k的值为0,同时执行k++,k变为1.进入下一次循环,for里面k++,k变为2.
第2次:k=2,调用fun(k),x=k=2。y=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]分别变为121,36,121,36。
然后返回y的值74。
输出主y , x[1][1]、x[1][2]值分别为74,36,17。
45.【答案】D
【解析】双引号表示字符串,单引号表示字符,AB错误。空字符也就是空值用’\0’表示,C错误。D选项分别为十六进制和八进制转义字符,正确。
46.【答案】B
每次循环当*ptr为0输出x,不为0输出’A’+*ptr。array数组5个元素为5,3,1,0,0。把前三次循环执行输出’A’+5,’A’+3,’A’+1,即FDB,后两次循环*ptr都为0,执行输出两个XX。答案为B选项。
47.【答案】D
【解析】D选项中d定义为字符,不能给字符变量赋值字符串。
48.【答案】A
【解析】数组是一个集合的概念,并不能作为一个值来处理。而函数返回值只能是1个或0个。故A选项错。
49.【答案】A
【解析】调用函数,把12.654,11,22。分别传递给fun函数的s,a,b。
然后a=(int)(s),即强制转换为整数再赋值给a。a变为11。b=s-a=12.654-11=1.654.随后返回a+b=12.654。
第1个输出格式为%5.2f,表示5个宽度,2位小数。结果为12.65。
由于本题传递是数值,形参不改变实参。实参a,b不会改变。
第2个输出a和b的值,同时要保持5个宽度,2位小数,即11.00,22.00。
选择A。
50.【答案】C
【解析】
第一个for循环。
第1次i=3,a[2]=3*2-1=5。
第2次i=2,a[1]=2*2-1=3,
第3次i=1,a[0]=1*2-1=1;
while()循环
第1次i=0,x=2。while(a[0]<2)为真,i++;,i变为1;
第2次i=1,x=2。while(a[1]<2)为假循环结束。
下一步将i赋值给p。p变为1。
第二个for循环:
1、当i=3,i>p为真执行a[3]=a[3-1]=5,i—后i变为2,a[3]=5。
2、当i=2,i>p为真执行a[2]=a[2-1]=3,i—后i变为1,a[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->i,q->j。通过调用函数传递后,a->i,b->j。然后交换*a和*b。即交换i和j的值。i变为7,j变为3。
然后再交换a和b,指交换两个地址,也就是交换指针方向,此时,a->j,b->i,然后输出*a和*b即输出j和i的值分别为3和7。
然后执行main()里面输出i,j,*p,*q。即为7,3,7,3。
选择D选项。
53.【答案】A
【解析】使用库函数要加相应的预处理命令。
54.【答案】A
【解析】不管任何变量都要类型相同才能赋值,A对。P+1代表移动一个存储单元,单元大小由类型决定如类型为char表示1个字节,若为short表示2个字节。B选项错。p=0表示给指针赋空值,指不指向向任何内存,C错误。通过指针存取变量为间接存取。D选项错。
55.【答案】D
【解析】通过fun函数调用将6.5,pa,pb分别传递给x,y,z。*y即a,*z即b.
*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:*P、2:x[]、3:x[N]。所以本题选择A。
60.【答案】D
【解析】通过调用把a的值传给fun函数里面的a,(int)a 强制转换为3,x=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组大小2。d定义为字符,不能级字符赋值字符串。a、b定义正确。
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选项是逻辑运算,结果只有0和1,并不会是字母。C选项结果是对除以65或97的余数。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。数组各元素为{1,3,0};{5,0,0};{7,9,0}。
下面嵌套的循环是输出数组各元素。外层一次,内层一轮。
当i=2,j=2,1,0。逆序输出第3行即0,9,7。
当i=1,j=2,1,0。逆序输出第2行即0,0,5。
当i=0,j=2,1,0。逆序输出第1行即0,3,1。
结果选择A。
69.【答案】A
【解析】B选项不能给指针赋值地址值之外的值。C选项只能限变量的地址。D选项,若取指针的地址,那即是二级地址,与基类型相同指针变量类型不一致不能相互赋值。
70.【答案】D
【解析】fun函数功能是若i为偶数a[i]=a[i]+n。i为奇数a[i]=a[i]-n。即下标为偶数的元素加5,为奇数的元素减5。a数组5个元素变为10,-1-8,-3,6。
选择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
【解析】通过调用将首地址传给s。s指向第一个元素。s[i]等价于a[i]。s[1]=s[1]+6=8。即a[1]=8。*s=7即a[0]=7。s=s+2,s变为第3个元素地址,返回s赋值给p,p为第3个元素a[2]的地址,*p即a[2]。
输出a[0],a[1],*P 分别为7,8,3。
74.【答案】B
【解析】每次循环把比较大的元素地址赋值给*k。当所有循环结束后,下标为*k的元素即是最大值。fun函数*k等价于main函数里面k .题目输出k与a[k],即输出最大值及其下标。
75.【答案】A
【解析】A选项中指针t没有初始化,不能给*t赋值,语法错误。
76.【答案】C
【解析】通过调用将a[1]地址传给s。s指向a[1]。然后s=s+1。s指向a[2]。此时s[i]等价于a[i+2]。s[1]+=6即a[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]为2,a[2]为10,*p即a[3]值为10,p[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%3为0执行a[i]=a[i]-n。当i%3不为0执行a[]=a[]=n。
当i=0,a[0]=a[0]-5=1。
当i=1,a[1]=a[1]+5=12。
当i=2,a[2]=a[2]+5=13。
当i=3,a[3]=a[3]-5=4。
当i=4,a[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*3,f2返回5*5。
83.【答案】A
【解析】A选项二维数组列数不能省略。
84.【答案】A
【解析】p、q分别指向i和j。将pq传递给s和t。*s和*t即i和是。f函数里面执行if(*s<*t)为真,将*t赋值给*s即i=j=5。然后i和j都变为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’并赋值给c,c=’6’。
a是传值 ,那么Main里面实参a不会变,还是’3’。b是传地址,*s等价b,即b=’3’。
main输出a,b,c为3,3,6。
86.【答案】D
【解析】un函数中,当交换完下标为i和j的元素后,执行i++,j--,然后继续交换,可得fun函数功能是逆置下标从n1到n2的数组元素。
fun(p,0,3)即逆置前4个。数组变为4321567890。
fun(p,4,9)即逆置下标4到9的元素。数组变为4321098765。
fun(p,0,9) 即逆置下标0到9的元素. 数组变为5678901234。
87.【答案】B
【解析】说明数组时方括号中是正的整型常量即可以,可以是1+4这种带运算符号的形式,AC错误。数组元素下标只能是整形或字符型,D错。
88.【答案】B
【解析】a[6-8/2]=a[2]=3。
89.【答案】D
【解析】fun函数中当flag为1,执行a[i]<a[j],当flag为0,执行a[i]>a[j]。
for() for() if()这种结构是排序的结构。
第1次调用fun(c,5,1)把c、5、1分别传给a,n,flag。flag为1,执行a[i]>a[j],此时对数组进行从第1个元素开始到第5个从大到小排序。数组变为:10,9,8,7,3,5,1,6,2,4。
第2次调用fun(c+5,5,0)把c+5、5、0分别传给a,n,flag。flag为0,执行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}首地址传入函数,函数实现将数组每个元素加2,arrray={3,4,2,2,2}。依次输出数组前4个元素为3,4,2,2。A选项正确。
91.【答案】A
【解析】通过指针引用变量为间接存取。
92.【答案】B
【解析】
p-a表示两个位置相减,由于把a赋值给p,所以p-a的值为0。a[p-a]即a[0]的值为11。
p[i]等价于a[i],i=9,p[i]即a[9]的值为20。
*(&a[i])等价a[i]也为20。
输出结果为11,20,20。
93.【答案】A
【解析】函数首部,函数声明中的形参与函数调用的实参是相匹配的。当实参为指针或数组名时函数首部或声明中的形参有三种形式:1、*P。2、x[]。3、x[N]。所以本题选择A。
94.【答案】A
【解析】p->i,q->j。经过调用swap(p,q), a->i,b->j。当在函数执行tp=a;a=b;b=tp;后交换指针指向:b->i,a->j。再次执行*t=*a;*a=*b;*b=*t;后i和j的值发生交换。
此时输出*a,*b,即输出j和i的值3,7。
main()函数输出*p和*q,即输出i和j的值7和3。
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。下标为奇数的元素不变。数组变为: 1,0,2,0,3,0,4,0,5
99.【答案】D
【解析】,传值,形参不改变实参。两次调用都不会改变a的值。
100.【答案】B
【解析】考查传值与传地址的区别。
f3()函数传递 地址,然后在函数交换的是*a和*b,即地址指向的值t1和t2。然后t1变为B,t2变为A。输出BA。
f2()函数同样是传地址,但交换的是地址,即只交换指针方向,并没有改为t1和t2的值。输出AB。
f1()函数t1传递地址,t2传递值。这样t2传值,形参不改变实参,t2的值 不变还为B。由于在f1函数执行了*a=b=’B’。*a即t1,t1变为。输出t1和t2为BB。
101.【答案】B
【解析】array数组5个元素为2,2,0,0,0。change函数功能是将每个元素减1.即5个数组元素变为1,1,-1,-1,-1。
102.【答案】B
【解析】循环嵌套。外层一次,内层一轮。
外层第1次:
当i=0,首先进入内层第1个for循环。
1、j=i=0,a[0][0]=a[4-0-1][0]=i+1;即a[0][0]=a[3][0]=1。
2、j=1,a[0][1]=a[4-0-1][1]=i+1;即a[0][1]=a[3][1]=1。
3、j=2,a[0][2]=a[4-0-1][2]=i+1;即a[0][2]=a[3][2]=1。
4、j=3,a[0][3]=a[4-0-1][3]=i+1;即a[0][3]=a[3][3]=1。
5、j=4,j<n-i为假for结束循环。
再进入第二个for循环
1、k=i+1=1,a[1][0]=a[1][3]=1;
2、k=2,a[2][0]=a[2][3]=1;
3、k=3,k<n-1-i为假,循环结束
外层第2次:
当i=1;第二次进入内层第1个for循环。
1、j=1=1,a[1][1]=a[4-1-1][1]=i+1;即a[1][1]=a[2][1]=2。
2、j=2,a[1][2]=a[4-1-1][2]=i+1;即a[1][2]=a[2][2]=2。
3、j=3,j<N-i为假,结束循环。
再次进入内层第2个for。
1、k=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
【解析】函数每次将i和2分别传给a和b。返回a+b-2,即返回i+2-2的值为i。i从0到3。选择A。
104.【答案】C
【解析】函数调用将m地址传给s.。然后在函数里面重新给s赋值k的地址,s指向k。*s等价于k 。*s=7,即k=7。此时执行输出m值不变。k是全局变量,也就是静态变量,输出k的值为改变之后的值。
答案为3,7。
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、*p、a三个等价,A选项正确,D选项错。BC是变量
109.【答案】D
【解析】局部变量概念。定义在复合语句内的变量只在本复合语句范围有效,D错。
110.【答案】D
【解析】array数组4个元素分别是0,1,0。ptr指向第一个元素。
第一次循环,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函数中当flag为1,执行a[i]<a[j],当flag为0,执行a[i]>a[j]。
for() for() if()这种结构是排序的结构。
第1次调用fun(c,10,1)把c、10、1分别传给a,n,flag。flag为1,执行a[i]<a[j],此时对数组进行从大到小排序。数组变为:10,9,8,7,6,5,4,3,2,1
第2次调用fun(c,5,0)把c、5、0分别传给a,n,flag。flag为0,执行a[i]>a[j],此时对数组里面第1个到第5个进行从大到小排序。数组变为:6,7,8,9,10,1,2,3,4,5。
然后输出数组各元素。
113.【答案】A
【解析】A选项rand()%10000即随机产生一个0—9999的整数,然后再把这个随机数除以100.0即可以得到一个0—99.99的小数。
114.【答案】B
【解析】pk指向k,pm指向m,那*pk和*pm即分别等价k和m。
*(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
【解析】题干数组是3行3列,第1行1,2,3。第2行4,5,6。第3行7,0,0。
A选项是3行3列,第1行1,2,0。第2行3,4,5。第3行6,7,0。
C选项是3行3列,第1行1,2,3。第2行4,5,0。第3行6,7,0。
D选项是3行3行,第1行1,0,0。第2行2,3,4。第3行5,6,7。
117.【答案】C
【解析】fun函数里面第一个循环功能是求第1列和第4列元素之和赋值给y,y=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=0时k=0,1,2。当i=1时k=0,1,2。
分别输出array[0][0]、array[1][0]、array[2][0]、array[0][1]、array[1][1]、array[2][2]。
值分别为1,0,2,0,0,9。
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()这种结构是排序的结构。
当flag为1,执行a[i]<a[j],从大到小排序。
当flag为0,执行a[i]>a[j],从小到大排序。
第1次调用fun(c,10,0)把c、10、0分别传给a,n,flag。flag为1,此时对数组进行从小到大排序。数组变为:1,2,3,4,5,6,7,8,9,10。
第2次调用fun(c,5,1)把c、5、1分别传给a,n,flag。flag为0,执行a[i]>a[j],此时对数组里面第1个到第5个进行从大到小排序。数组变为:5,4,3,2,1,6,7,8,9,10。
然后输出数组各元素。
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。所以*ptr和a等价均为4。
134.【答案】A
【解析】A选项只调用两次,相当于max等于括号里面逗号表达式的值,即getmax(c,d)的值,getmax(c,d)返回的是cd里面的较大值。也就是说A选项只是c、d这两个里面的最大值,并不是4个元素的最大值。
135.【答案】A
【解析】多个实参之前用逗号隔开。