1、国家二级 C语言机试(编译预处理和指针)模拟试卷 4及答案与解析 一、选择题 1 有以下程序 #definePT3 5; #defineS(x)PT*x*x; main( ) inta=l, b=2; printf( 4 1fn, S(a+b); 程序运行后的输出结果是 ( A) 31 5 ( B) 7 5 ( C)程序有错无输出结果 ( D) 14 2 有以下程序 #include stdio h #defineS(x)4*(x)*x+1 yoidmain( ) intk=5,j=2: printf( dn, S(k+j); 程序运行后的输出结果是 ( A) 197 ( B) 143 ( C
2、) 33 ( D) 28 3 有以下程序 #include stdio h #defineSUB(a)(a)-(a) main( ) inta=2, b=3, c=5, d; d=SUB(a+b)*c: printf( dln, d); 程序运行后的输出结果是 ( A) -12 ( B) 0 ( C) 10 ( D) -20 4 有下列程序: #include stdio_h #deftneN5 #defineMN+1 #definefix)(x*M) main( ) inti1, i2; i1=f(2); i2=f(1+1); printf( d dn, il, i2); 程序的运行结果是
3、( A) 127 ( B) 1212 ( C) 1111 ( D) 117 5 若程序中有宏定义行: #defineN100则以下叙述中正确的是 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)上述宏定义行实现将 100赋给标示符 N ( C)在运行时用 100替换标识 符 N ( D)在编译程序对 C源程序进行预处理时用 100替换标识符 N 6 有以下程序 #include stdio h #deftneN2 #defineMN+1 #defineNUM(M+1)*M/2 main( )printf( dn, NUM); ) 程序运行后的输出结果是 ( A) 4 ( B) 8
4、 ( C) 9 ( D) 6 7 下面选项中关于编译预处理的叙述正确的是 ( A)凡是以 #号开头的行,都被称为编译预处理命令行 ( B)预处理命令行必须使用分号结尾 ( C)预处理命令行不 能出现在程序的最后一行 ( D)预处理命令行的作用域是到最近的函数结束处 8 以下叙述中正确的是 ( A)在包含文件中,不得再包含其他文件 ( B) #inc1ude命令行不能出现在程序文件的中间 ( C)在一个程序中,允许使用任意数量的 #inc1ude命令行 ( D)虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接 9 有以下程序 #include stdio h #include
5、stdio h intfun(intn) int*p; p=(int*)malloc(sizeof(int); *p=n; return*p; main( ) inta; a=fun(10); printf( dn a+fun(10); 程序的运行结果是 ( A) 10 ( B) 20 ( C) 0 ( D)出错 10 有以下程序 yoidfun(int*pl, int*p2, int*S) s=(int*)malloc(sizeof(int); *S=*pl+*(p2+); ) main( ) inta2=1,2, b2=10, 20, *s=a; fun(a,b, S); printf(
6、dha, *S); 程序运行后的输出结果是 ( A) 10 ( B) 11 ( C) 2 ( D) 1 11 有以下程序 yoidfun(double*p1, double*p2, double*S) S=(double*)calloc(1, sizeof(double); *S=*pl+*(p2+1); ) main( ) doublea2=1 1, 2 2, b2=10 0, 20 0, *s=a; fun(a, b, S); printf( 5 2fin, *s); ) 程序的输出结果是 ( A) 1 10 ( B) 11 10 ( C) 12 10 ( D) 21.1 12 设有以下函
7、数: yoidfun(intn, char*s) 则下面对函数指针的定义和赋值均正确的是 ( A) yoid*Pf0; pf=fun; ( B) yoid(*pf)(int, char*); pf=fun; ( C) yoid*pff); *pf=fun; ( D) yoid(*pf)(int, char); pf= fun; 13 以下叙述中正确的是 ( A)指针变量只能通过求地址运 算符 ( )来获得地址值 ( B)语句 p=NULL;与 p=0;是等价的语句 ( C) int*pl; int*p2; int*p3;都是合法的定义指针变量的语句 ( D)语句 p=NULL;执行后,指针 P
8、指向地址为 0的存储单元 14 设有某函数的说明为 int*func(inta10, intn);则下列叙述中,正确的是 ( A)说明中的 a10写成 a或 *a效果完全一样 ( B)形参 a对应的实参只能是数组名 ( C) func的函数体中不能对 a进行移动指针 (如 a+)的操作 ( D)只有指向 10个整数内存 单元的指针,才能作为实参传给 a 15 设有定义: intx=0, *p;紧接着的赋值语句正确的是 ( A) *p=NULL; ( B) p=NULL; ( C) p=x; ( D) *p=x; 16 设已有定义: floatx;则以下对指针变量 P进行定义且赋初值的语句中正确
9、的是 ( A) int*p=(float)x; ( B) float*p= x; ( C) floatp= x; ( D) float*p=1024; 17 下面选项中的程序段,没有编译错误的是 ( A) char*sp, s10; sp=Hello; ( B) char*sp, s10; S=Hello; ( C) charstrl10=computer, str210; str2=strl; ( D) charmark; mark=PROGRAM; 18 有以下程序 main( ) inta=l, b=3, c=5; int*pl= a, *p2= b, *p= c; *P: *p1*(*
10、p2); printf( dn, c); 执行后的输出结果是 ( A) 2 ( B) 3 ( C) 1 ( D) 4 19 若有定义语句: intyear=2009, *p= year;以下不能使变量 year中的值增至2010的语句是 ( A) (*p)+; ( B) +(*p); ( C) *p+; ( D) *p+=1; 20 以下叙述中正确的是 ( A)如果 P是指针变量,则 *p表示变量 p的地址值 ( B)如果 p是指针变量,则 p是不合法的表达式 ( C)在对指针进行加、减算 *运算时,数字 1表示 1个存储单元的长度 ( D)如果 P是指针变量,则 *p+l和 *(p+1)的效
11、果是一样的 21 设有定义: char*c:以下选项中能 够使 C正确指向一个字符串的是 ( A) charstr=string; c=str; ( B) scanf( s, c); ( C) c=getchar( ); ( D) *c=string; 22 有以下程序 #include stdio h main( ) intn, *p=NULL; *p= n; printf(Inputn: ); scanf( d, p); printf(outputn; ); printf( dn,p); 该程序试图 通过指针 P为变量 n读入数据并输出,但程序有多处错误,以下语句正确的是 ( A) int
12、n, *p=NULL; ( B) *p= n; ( C) scanf( d, p) ( D) printf( dn, p); 23 若有以下定义 intx10, *pt=x;则对 x数组元素的正确引用是 ( A) *(x+3) ( B) * x10 ( C) *(pt+10) ( D) pt+3 24 有以下程序 yoidfun(char*S) chara10; strcpy(a, STRING); S=a; main( ) char*p=PROGRAM; fun(P); printf( sn, p); ) 程序运行后的输出结果是 (此处 代表空格 ) ( A) STRNG ( B) PROG
13、RAM ( C) STRING ( D) STRING 25 有以下程序 #include stdio h intfun(char*S) char*p=s; while(*P!=0)p+; retum(p-s); main( ) printf( dkn, fun(goodbey!); ) 程序的输出结果是 ( A) 6 ( B) 8 ( C) 0 ( D) 7 26 有下列程序: yoidflint*q) finti=0; for(; i 5; i+)(*q)+; main( ) inta5=1, 2, 3, 4, 5, i; f(a); for(i=0; i 5; i+)printf( d,
14、 , ai); 程序运行后的输出结果是 ( A) 2, 2, 3, 4, 5, ( B) 6, 2, 3, 4, 5, ( C) 1, 2, 3, 4, 5, ( D) 2, 3, 4, 5, 6 27 以下函数按每行 8个输出数组中的数据: yoidfun(int*w, intn) inti; for(i=0; i n; i+) _ printf( d, wi); printf(n); 下划线处应填入的语句是 ( A) if(i 8=0)printf(n); ( B) if(i/8=0)continue; ( C) if(i/8=0)printf(n); ( D) if(i 8=0)cont
15、inue; 28 有以下程序 #include stdioh yoidflint*p,int*q); main( ) intm=1, n=2, *r= m; f(r, n); printf( d, d, m, n); yoidflint*p, int*q) P=p+l; *q=*q+l; ) 程序运行后的输出结果是 ( A) 2, 3 ( B) 1, 3 ( C) 1, 4 ( D) l, 2 29 有下列程序: yoidflintb) intI; for(i=2; i 6; i+)bi*=2; main( ) inta10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i;
16、fla); for(i=0; i 10, i+)printf( d, ”, ai); 程序运行后的输出结果是 ( A) 1,2, 3, 4, 5, 6, 7, 8, 9, 10, ( B) 1,2, 3, 4, 10, 12, 14, 16, 9, 10, ( C) 1,2, 6, 8, 10, 12, 7, 8, 9, 10, ( D) 1, 2, 6, 8, 10, 12, 14, 16, 9, 10 30 若有以下程序 #include stdio h yoidsp(int*a) intb=2: a= b: *a=*a*2: printf( d, , *a); main( )intk=3
17、, *P= k; sp(p); printf( d, dn, k, *p); ) 则程序的输出结果是 ( A) 4, 3, 4 ( B) 4, 3, 3 ( C) 6,3, 6 ( D) 6,6, 6 31 若有以下程序 #include stdio h int*f(int*s, int*t) int*k; if(*S *t) k=s; s=t; t=k; ) returns; ) main( ) inti=3, 3=5, *p= i, *q= j, *r; r=f(p, q); printf( d, d, d, d, dn, i, j, *P, *q, *r); ) 则程序的输出结果是 (
18、A) 3,5, 5, 3, 5 ( B) 5, 3, 5, 3, 5 ( C) 5, 3, 3, 5, 5 ( D) 3, 5, 3, 5, 5 32 若有以下程序 #include stdio h intk=7, m=5; yoidflint*S) int*t= k: s= t; *s= m; printf( d, d, d, , k, *t, *s); main( ) inti=3, *p= i, *r= p; fir); printf( d, d, dn, i, *P, *r); 则程序的输出结果是 ( A) 7, 5, 7, 3, 3, 3, ( B) 7, 5, 7, 3, 5, 7
19、, ( C) 7, 5, 5, 3, 3, 3, ( D) 7,7, 5, 3, 3, 3 33 有以下程序 #include stdi0-h intfuna(inta, intb) retuma+b; intfunb(inta, intb)returna-b; intSSS(int(*t)0, intx, intY)return(*t)(x, y); main( ) intx; x=sss(funa, 9,3); x+=sss(funb, 8, 3); printf( dkn, x); 程序运行后的输出结果是 ( A) 17 ( B) 23 ( C) 24 ( D) 22 34 有以下程序
20、yoidfun(int*P, int*q)intt; t=*p; *P=*q; *q=t; *q=*p; ) main( ) inta=0, b=9; fun( a, b); printf( d dn, a,b); 程 序的输出结果是 ( A) 00 ( B) 99 ( C) 90 ( D) 9 35 有以下程序 yoidswap(char*x, char*y) chart; t=*x; *x=*y; *y t; ) main( ) char*sl=abc”, *s2=123“; swap(s1, s2); printf( s, sn”, s1, s2); 程序执行后的输出结果是 ( A) a
21、bc, 123 ( B) 123, abc ( C) 321, cba ( D) lbc, a23 36 有以下函数 intfun(char*s)char*t=s; while(*t+); retum(t s); )该函数的功能是 ( A)比较两个字符串的大小 ( B)计算 S所指字符串的长度 ( C)计算 S所指字符串占用内存字节的个数 ( D)将 S所指字符串复制到字符串 t中 37 有以下程序 #include stdio h yoidfun(char*p) +p; printf( sha, *p); main( ) char*a=(Morning,Aftemoon,Eyening,Ni
22、ght); fun(a); 程序的运行结果是 ( A) ffemoon ( B) Morning ( C) oming ( D) Afternoon 38 有以下程序 #include stdio h voidfun(char*a, char ) while(*a=*)a+; while(*b=*a)b+; a+; ) main( ) char*s=*a*b*, t80; fun(s, t); puts(t); ) 程序的运行结果是 ( A) a*b ( B) *a*b ( C) a*b* ( D) ab 39 有以下程序 #include stdio h #include string h
23、voidfun(charS10, intn) chart; inti, j; for(i=0; i n-1; i+) for(j=i+1 j n0+) if(si0 sj0)t=si0; si0 sj0; sD0 t; main( ) charss510=bcc,bbcc, xy”, aaaacc,aabcc); fun(ss, 5); printf(“ s, s11”, ss0, ss4); 程序的运行结果是 ( A) aaaacc, xy ( B) bcc, aabcc ( C) xy, aaaacc ( D) aabcc, bcc 40 有以下程序 #include stdio h #i
24、nclude string_h voidfun(char*W, intm) chars, *p1, *p2; p1 w; p2 w+m-1; while(pl p2)s=*p1; *p1=*p2; *p2 s; p1+; p2-; main( ) 1chara=“123456“; fun(a, strlen(a); puts(a); ( A) 116611 ( B) 161616 ( C) 65432l ( D) 123456 41 有以下程序 #include stdio h #include sting-h voidfun(int*p1, int*p2, int*s) s (int*)ca
25、lloc(1, sizeof(int); *s *p1+*p2; free(s); main( ) inta21=l, 2), b2 40, 50), *q=a; fun(a, b, q); printf(“ dn”, *q); ) 程序运行后的输出结果是 ( A) 41 ( B) 42 ( C) 0 ( D) 1 国家二级 C语言机试(编译预处理和指针)模拟试卷 4答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话 S(a+b)=PT*a+b*a+b=3 5*l+2*1+2=7 5。 【知识模块】 编译预处理和
26、指针 2 【正确答案】 B 【试题解析】 这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏 S(x),当在主函数中用参数 k+j调用宏 s时,根据宏替换的原则,则S(k+j)=S(5+2)=4*7*5+2+1=143。 【知识模块】 编译预处理和指针 3 【正确答案】 D 【试题解析】 本题主要考查的是宏替换,在程序中执行 d=sub(a+b)+c这条语句时,首先要进行宏替换,依据宏 suB(a)的定义可知,上面这 条语句替换为d=(a+b) (a+b)+c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即 d=5 5*5=-20。 【知识模块】 编译预处理和指针
27、 4 【正确答案】 D 【试题解析】 在本题中,定义了 3个宏定义语句,分别是: #defineN5、#defineMN+5和 #definef(x)(x*M),所以根据 C语言的宏替换规则,我们可知,f(2)=2*N+l=2*5+l=11, f(1+1)=1+1*N+1: 1+l*5+1=7。 【知识模块】 编译预处理和指针 5 【正确答 案】 D 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为 ”编译预处理 ”。其含义是在 c编译程序对 c源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由 #define定义的宏就是编译预处理命令。 C程序在进行编译之前
28、,都要先对程序中所有出现的 ”宏名 ”,都用宏定义中的替换文本进行替换。 【知识模块】 编译预处理和指针 6 【正确答案】 B 【试题解析】 宏展开以后 NuM为 (2+1+1)*2+1/2,计算以后值为 8。注意在进行宏展开的时候,千万不要试图计算,展开以后 再进行计算。 【知识模块】 编译预处理和指针 7 【正确答案】 A 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以 “#”号开始,每行的末尾不能用 “; ”号结束,以区别于 c语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用
29、一直持续到源文件的末尾。 【知识模块】 编译预处理和指针 8 【正确答案】 C 【试题解析】 #inc1ude文件包含命令,使用时应注意以下 5个规则: 包 含文件的 #inc1ude命令行通常应书写在所用源程序文件的开头,故有时也把包含文件称作 ”头文件 ”。头文件名可以由用户指定,其后缀不一定用 “ h”。 包含文件中,一般包含有一些公用的 #define命令行、外部说明或对 (库 )函数的原型说明。 当包含文件修改后,对包含该文件的源程序必须重新进行编译连接。 在一个程序中,允许有任意多个 #inc1ude命令行。 在包含文件中还可以包含其他文件。 【知识模块】 编译预处理和指针 9 【
30、正确答案】 B 【试题解析】 函数 fun(intn)的功能是在内存中每 次动态的申请一个整型变量的存储空间,把整型变量 n的值存入这个存储空间中。所以当在主函数中执行输出语句时, a+fun(10)的值等于 20。 【知识模块】 编译预处理和指针 10 【正确答案】 D 【试题解析】 主函数中定义指针 s指向数组 a,调用 fun函数,首先是实参传给形参,因此 p1指向 a, p2指向 b, s指向 a,即 *s的值为 1。流程到调用函数 fun执行,首先更改 s的指向为新分空间的首地址,表达式 *s=*pl+*(p2+),取 p1指向数据位 1,加上 p2指向数据 10, p2后移,存放到
31、 s指向的空间 中 11流程结束,形参 s和 pl, p2撤销,存入 s指向空间的数据丢失,主函数输出 s指向数据仍然是 1。 【知识模块】 编译预处理和指针 11 【正确答案】 A 【试题解析】 ANSIC标准规定 calloc函数返回值的类型为 void*。具体使用格式为: calloc(n, size)。该函数用来给 n个同一类型的数据项分配连续的存储空间,每个数据项的长度为 size个字节。若分配成功,函数返回存储空间的首地址;否则返同空。通过调用 calloc函数所分配的存储单元,系统自动置初值 0。土函数中定义数组 a, b, 以及指针 s指向数组 a,渊用 fun函数,实参 a和
32、 b,以及 s的值传递给相对应形参 p1, p2,以及 s,在 fun函数中更改 s的指向,以及指向的数据,但是函数调用结束以后,形参空间撤销,这项改变对于实参没有影响,因此实参 s指向值不变,仍然为 1 1。 【知识模块】 编译预处理和指针 12 【正确答案】 B 【试题解析】 函数指针的定义形式是:数据类型标识符 (*指针变量名 )( );void(*pf)( )定义了一个没有返回值的函数指针 pf,在给甬数指针变量赋值时,只需给出函数名而不必给出参数。 所以给 pf给赋值时,把函数名 fun赋给 pf即可。 【知识模块】 编译预处理和指针 13 【正确答案】 C 【试题解析】 指针变量定
33、义形式为:类型 *指针变量名;其中 *号的个数决定了几级指针,指针变量赋地址值的方式有 3种方式: 通过求地址运算符 ( )获得地址值 通过指针变量获得地址值 通过标准函数获得地址值另外 NULL是在stdio h头文件中定义的预定义符。 NULL的代码值为 0。可以给指针变量赋NuLL值。例如 p=NuLL;赋值语句,称 p为空指针。这条语句等价于 p=0;或p=0;这时,指 针 D并不是指向地址为 0的存储单元,而是具有一个确定的值 ”空 ”。 【知识模块】 编译预处理和指针 14 【正确答案】 A 【试题解析】 函数 func为返同值为指针的函数,有两个形参,形参数组 a为指针变量,保存
34、实参数组的首地址,其元素个数由实参数组决定,因此说明中的a10写成 a或 *a效果完全一样。 【知识模块】 编译预处理和指针 15 【正确答案】 B 【试题解析】 定义指针变量时,必须将指针变量初始化为 NuLL(为空 ),否则,如果不赋给它地址,系统会随机给它分配一个 地址。 【知识模块】 编译预处理和指针 16 【正确答案】 B 【试题解析】 定义指针变量的一般形式为:类型名 *指针变量名 1, *指针变量名2, ;。对一个指针变量赋值要通过求地址运算符 ( )获得变量的地址值,然后把此地址值赋给指针变量。因而在选项 A的表达式中,赋值号的左边表示定义了指针变量 p,而右边表示求变量 x的
35、地址值。 【知识模块】 编译预处理和指针 17 【正确答案】 A 【试题解析】 选项 B中数组名为常量,不能赋值,选项 C字符数组之间无法完成赋值操作,选项 D和选项 B相 同,无法对数组进行赋值。 【知识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 程序使整型指针 p1、 p2、 p3指向 a、 b、 c值所存放的地址空间。然后再将指针变量 *p1、 *p2中的值的乘积赋给指针变量 *p,即赋给变量 c,输出 c的值 3。 【知识模块】 编译预处理和指针 19 【正确答案】 C 【试题解析】 由于自加运算符 +的运算级高于间接运算 *的运算级,所以选项 A的表达式 *p+不
36、能使变量: yeal中的值增至 2010。 【知识模块】 编译预处理和指针 20 【正确答案】 C 【试题解析】 移动指针是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运算。除此之外,不可以对指针进行任何其他的算 *运算。 C语言提供了一个间接访问运算符 (*),又称间址运算符,它是一个单日运算符,优先级比较高,高于普通的算 *运算符,但是低于 ( )运算符,因 此 *p+1和
37、 *(p+1)的含义是不一样。当指针变量中存放了一个确切的地址值时,就可以用 ”简接访问运算符 ”通过指针来引用该地址的存储单元。 【知识模块】 编译预处理和指针 21 【正确答案】 A 【试题解析】 在题目的题干中定义了字符指针变量 c,在选项 A中,首先定义字符数组 str,然后再把字符数组 str的首地址赋给字符指针变量 c。所以选项 A是正确的。在选项 D中,如果在定义字符指针 c时,同时给 c赋初值时,这样的表达式是正确的。而本题不是在定义指针 c时,同时给 c赋初值。 【知识模块】 编译预 处理和指针 22 【正确答案】 A 【试题解析】 选项 A表示在程序中,声明定义变量语句 “
38、intn, +p=NuLL; ”定义了整型变量 n和指针变量 p,并且指针变量 p初始化为空。其他的语句都是错误的。其中选项 B, n的地址应存放到指针变量 p中,而选项 C中数据输入项错误,选项 D输出地址信息。 【知识模块】 编译预处理和指针 23 【正确答案】 A 【试题解析】 本题考查指针的调用。 x代表 x10数组的首地址指针, pt是指向x10数组的首地址的指针,即两者指向同一内存单元。 *(x+3)等同于 x3。 【知识模块】 编译预处理和指针 24 【正确答案】 B 【试题解析】 函数 fun的主要功能是把字符串 STRING,存放到字符数组 a中, s指向该字符串,函数调用结
39、束以后,释放 s和 a指向的空间。主函数调用fun(p),并不能更改 p的值,因此 p的指向没有改变。 【知识模块】 编译预处理和指针 25 【正确答案】 B 【试题解析】 函数 fun的主要功能是计算字符串中实际字符的个数,因此“goodbey!”含有字符为 8,返回值为 8。 【知识模块】 编译预 处理和指针 26 【正确答案】 B 【试题解析】 voidf(int*q)函数的功能是对 (*q)的值连续 5次自加 1。在 main( )函数中 f(a)语句把一维数组 a5的首地址作为实参,传递给函数 f(int*q)的形参q,然后存函数 f(int*q)内, a0连续 5次自加 l后, a
40、0的值就变成 6。所以输出为6,2, 3, 4, 5。 【知识模块】 编译预处理和指针 27 【正确答案】 A 【试题解析】 本题考查判断语句与循环语句。欲使每行输出 8个数据,则必然使用取余运算,当 i 8=0时先输出一个换行符冉输出字符。选项 D中, continue语句的作用是停止执行本次循环位于 continue后面的语句,而进入下一次循环。 【知识模块】 编译预处理和指针 28 【正确答案】 B 【试题解析】 小题考查函数的调用与指针。 fun( )函数的作厂乃是:使指针 p指向原来所指变量的下一个变量,使 q指针指向的值加 1。主函数中,指针 r指向m,调用 fun( )函数的结果
41、是,使 r指向地址位于 m后面的变量,使位于 n的地址上的变量 (就是 n)的值加 1,因此,结果为 1, 3。 【知识 模块】 编译预处理和指针 29 【正确答案】 C 【试题解析】 函数 voidf(intb)的功能是对数组 b中第 2个到第 5个元素的值逐个扩大 2倍。所以在 main( )函数中, f(a)语句的作用是对数组 a10中从 a2到a5的各个数字乘以 2,因而数组 a10的元素就变成了 1, 2,6,8, 10, 12, 7,8,9, 10。 【知识模块】 编译预处理和指针 30 【正确答案】 B 【试题解析】 土函数中定义指针变量 p指向 k,调用函数 sp(p),将 k
42、的地址传递给形参 指针 a,函数转到 sp运行, a指向 b的地址,表达式 *a=*a*2,相当于b=b*2,得到 *a的数据 4输出。函数调用结束,此时 a和 b的空间撤销,而对实参k和 p的值并没有改变,仍旧是 3。 【知识模块】 编译预处理和指针 31 【正确答案】 D 【试题解析】 本题考查了返回值为指针的函数,函数 f的土要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中 p指向 i, q指向 j,调用 r=f(p, q),返同 q的地址,因此 *p=3, *q=5, *r=5。 【知识模块】 编译预处理和指针
43、 32 【正确答案】 C 【试题解析】 本题考查二级指针作为函数的参数,可以通过函数调用来改变主函数中一级指针的指向。主函数中指针变量 p指向 i, r指向 p,调用 f函数,形参指针 s指向 p,流程转到 f函数执行,指针变量指向 k, s指向 t,此时更改了 s的指i, uj, s指向了 t,更改了 s指向的地址空间内容为 m的地址,同时 t也指向变量m,因此 *s的值为 m的值, *t为 m的值, k为 7。流程返回到主函数,没有对主函数空间的数据和指向作出更改,因此全部为 3。 【知 识模块】 编译预处理和指针 33 【正确答案】 A 【试题解析】 函数 funa的功能计算两个数据的和
44、, funb的功能计算两个数据的差,函数 sss中利用指向函数的指针作为函数的参数,可以往调用的时候,根据接收的函数地址来决定调用那一个函数。土函数中调用 x=sss(funa, 9, 3),将 funa函数的地址传递给 t,因此 sss函数成为求两个数据的和 12,继续将 funb函数地址传给 t,求两个数据差为 5,和 s累加后结果为 17。 【知识模块】 编译预处理和指针 34 【正确答案】 B 【试题解 析】 函数 fun的主要功能是交换 p和 q指向的地址空间的数据,然后更改 p的指向的地址空间数据,使之和 q指向的数据相同。主函数调用 fun后, p指向 a, q指向 b,因此 a
45、和 b的数据全部为 9。 【知识模块】 编译预处理和指针 35 【正确答案】 D 【试题解析】 函数 voidswap(char*x, char*y)的功能是交换两个字符 *x和 *y中的内容。在主函数中字符指针 s1指向字符串 abc, s2指向字符串 123。所以函数swap(s1, s2)的执行结果就是字符 a和 相互交换。 【知 识模块】 编译预处理和指针 36 【正确答案】 C 【试题解析】 在函数 fun(char*s)中,首先用字符指针变量 t指向 s,而循环语句while(*t+);的功能是使指针变量 t指向字符串变量 s的末尾,这时退出循环,因而语句 retum(t-s);返
46、回的就是字符串 s所指字符串的长度。 【知识模块】 编译预处理和指针 37 【正确答案】 D 【试题解析】 在程序中,指针的指针变量 a和 p都是指向字符串的指针。执行fun(a)语句时, p指向的是字符串数组 a的第一个字符串 “Moming”, p自加 1之后, *p指向了字符串数组 a的第 2个字符串 “Aftemoon”。 【知识模块】 编译预处理和指针 38 【正确答案】 C 【试题解析】 主函数 main( )定义了指向字符串的指针和一个字符数组,接着调用 fun(s, t)函数,进行实参向形参传递,函数 fun( )第一个 while语句判断 *a中的值为 “*”时继续扫描,当遇
47、到不是 “*”时结束,接着第二个 while循环语句,将 *a中从 “a”开始的后续所有字符都赋予 *b,也就是 t80中的内容为 ”a*b*”。 【知识模 块】 编译预处理和指针 39 【正确答案】 C 【试题解析】 函数 fun(chars10, intn)通过两重 for循环语句,比较二维字符数组 s10的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首字符。在主函数中,语句 fun(ss, 5)的作用是对二维字符数组 ss510的 5个字符串的首字符进行从小到人的排序,不影响各个字符串另外的字符。所以排序结束后, 5个字符串的第一个字符依次变为 a、a、 b、 b和 x;最后输出第 1个和第 4个字符串。 【知识模块】 编译预处理和指针 40 【