1、国家二级 C语言机试(编译预处理和指针)模拟试卷 2及答案与解析 一、选择题 1 有以下程序 #define PT 3 5; #define S(x)PT*x*x; main() int a=1, b=2; printf(“ 4 1 f n“, S(a+b); ) 程序运行后的输出结果是 ( A) 31 5 ( B) 7 5 ( C)程序有错无输出结果 ( D) 14 0 2 有以下程序 #include #define S(x)4*(x)*x+1 void main() int k=5, j=2; printf(“ d n“, S(k+j); 程序运行后的输出结果是 ( A) 197 ( B
2、) 143 ( C) 33 ( D) 28 3 有以下程序 #include #define suB(a)(a)-(a) main() int a=2, b=3, c=5, d; d=SUB(a+b)*c: pfintf(“ d n“, d); 程序运行后的输出结果是 ( A) -12 ( B) 0 ( C) 10 ( D) -20 4 有下列程序: #include #define N 5 #define M N+1 #define f(x)(x*M) main() int i1, i2; i1=f(2); i2=f(1+1); printf(“ d d n“, i1, i2); 程序的 运
3、行结果是 ( A) 12 7 ( B) 12 12 ( C) 11 11 ( D) 11 7 5 若程序中有宏定义行: #define N 100则以下叙述中正确的是 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)上述宏定义行实现将 100赋给标示符 N ( C)在运行时用 100替换标识符 N ( D)在编译程序对 C源程序进行预处理时用 100替换标识符 N 6 有以下程序 #include #define N 2 #define M N+1 #define NUM(M+1)*M 2 main() printf(“ d n“, NUM); 程序运行后的输出结果是 ( A)
4、4 ( B) 8 ( C) 9 ( D) 6 7 下面选项中关于编译预处理的叙述正确的是 ( A)凡是以 #号开头的行,都被称为编译预处理命令行 ( B)预处理命令行必须使用分号结尾 ( C)预处理命令行不能出现在程序的最后一行 ( D)预处理命令行的作用域是到最近的函数结束处 8 以下叙述中正确的是 ( A)在包含文件中,不得再包含其他文件 ( B) #include命 令行不能出现在程序文件的中间 ( C)在一个程序中,允许使用任意数量的 #include命令行 ( D)虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接 9 以下程序 #include #include m
5、ain() int*a, *, *c; a=b=c=(int*)malloc(sizeof(int); *a=1; *b=2, *c=3; a=b; printf(“ d, d, d n“, *a, *, *c); 程序运行后的输出结果是 ( A) 2 2 3 ( B) 3, 3, 3 ( C) 1, 2, 3 ( D) 1, 1, 3 10 有以下程序段 int*p; p=_malloc(sizeof(int);若要求使 p指向一个 int型的动态存储单元,在横线处应填入的是 ( A) (int*) ( B) int ( C) int* ( D) (*int) 11 设有以下函数: void
6、 fun(int n, char*s) 则下面对函数指针的定义和赋值均正确的是 ( A) void*Pf(); pf=fun; ( B) void(*pf)(int, char*); pf=fun; ( C) void*Pf(); *pf=fun; ( D) void(*pf)(int, char); pf=&fun; 12 以下叙述中正确的是 ( A)指针变量只能通过求地址运算符 (&)来获得地址值 ( B)语句 p=NULL;与 p= 0;是等价的语句 ( C) int*p1; int*p2; int*p3;都是合法的定义指针变量的语句 ( D)语句 p=NULL;执行后,指针 P指向地址
7、为 0的存储单元 13 设有某函数的说明为 int*func(int a10, int n);则下列叙述中,正确的是 ( A)说明中的 a10写成 a或 *a效果完全一样 ( B)形参 a对应的实参只能是数组名 ( C) func的函数体中不能对 a进行移动指针 (如 a+)的操作 ( D)只有指向 10个整数内存单元的指针,才能作为实参传给 a 14 以下叙述中错误的是 ( A)函数可以返回地址值 ( B)改变函数形参的值,不会改变对应实参的值 ( C)当在程序的开头包含头文件 stdio h时,可以给指针变量赋 NULL ( D)可 以给指针变量赋一个整数作为地址值 15 有以下程序 ma
8、in() int m=1, n=2, *p=&m, *q=&n, *r; r=p; p=q; q=r; printf(“ d, d, d, d n“, m, n, *p, *q); ) 程序运行后的输出结果是 ( A) 1, 2, 1, 2 ( B) 1, 2, 2, 1 ( C) 2, 1, 2, 1 ( D) 2, 1, 1, 2 16 设有定义 double a10, *s=a;以下能够代表数组元素 a3的是 ( A) (*s)3 ( B) *s3 ( C) *s+3 ( D) *(s+3) 17 若有定义语句: int a23, *p3;则以下语句中正确的是 ( A) p0=&a12;
9、 ( B) p0=a; ( C) p=a; ( D) p1=&a; 18 有以下程序 main() int a5=2, 4, 6, 8, 10, *p, *k; p=a; k=&p; printf(“ d“, *(p+); printf(“ d n“, *k); 程序运行后的输出结果是 ( A) 4 4 ( B) 2 4 ( C) 2 2 ( D) 4 6 19 有以下程序 (注:字符 a的 ASCII码值为 97) main() char*s=“abc“; do printf(“ d“, *s 10); +s; )while(*s); ) 程序运行后的输出结果是 ( A) abe ( B)
10、7890 ( C) 979899 ( D) 789 20 有以下程序 #include main() int n, *p=NULL; *p=&n; printf(“Input n: “); scanf(“ d&p); printf(“output n: “); printf(“ d n“, p); 该程序试图通过指针 p为变量 n读入数据并输出,但程序有多处错误,以下语句正确的是 ( A) int n, *p=NULL; ( B) *p=&n; ( C) scant(“ d“, &p) ( D) printf(“ d n“, p); 21 若有以下定义 int x10, *pt=x;则对 x数
11、组元素的正确引用是 ( A) *(x+3) ( B) *&x10 ( C) *(pt+10) ( D) pt+3 22 有以下程序 void fun(char*s) char a10; strcpy(a, “STRING“); s=a; main() char*p=“PROGRAM“; fun(P); printf(“ s n“, p); 程序运行后的输出结果是 (此处 口代表空格 ) ( A) STRING ( B) PROGRAM ( C) STRING ( D) STRING 23 有以下程序 #include int fun(char*s) char*p=s; while(*P!=0)
12、p+; return(p-s); main() printf(“ d n“, fun(“goodbey!“); 程序的输出结果是 ( A) 6 ( B) 8 ( C) 0 ( D) 7 24 有下列程序: void flint*q) int i=0; for(; i 5; i+)(*q)+; main() int a5=1, 2, 3, 4, 5, i; f(a); for(i=0; i 5; i+)printf(“ d, “, ai); 程序运行后的输出结果是 ( A) 2, 2, 3, 4, 5, ( B) 6, 2, 3, 4, 5, ( C) 1, 2, 3, 4, 5, ( D) 2
13、, 3, 4, 5, 6, 25 以下函数按每行 8个输出数组中的数据: void fun(int*w, int n) int i; 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)continue; 26 有以下程序 #include void f(int*p, int*q); main() int m=1, n=2, *r=&
14、m; f(r,&n); printf(“ d, d“, m, n); void f(int*p, int*q) p=p+1; *q=*q+1; ) 程序运行后的输出结果是 ( A) 2, 3 ( B) 1, 3 ( C) 1, 4 ( D) 1, 2 27 有下列程序: void f(intb) int I; for(i=2; i 6; i+)bi*=2; main() int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i; f(a); for(i=0; i 10, i+)printf(“ d, “, ai); 程序运行后的输出结果是 ( A) 1, 2, 3, 4
15、, 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, 28 若有以下程序 #include stdio h void sp(int*a) int b=2; a=&b; *a=*a*2: printf(“ d, “, *a); ) main()int k=3, *p=&k; sp(p); printf(“ d, d n“, k, *p); ) 则程序的输出结果是 ( A) 4
16、, 3, 4 ( B) 4, 3, 3 ( C) 6, 3, 6 ( D) 6, 6, 6 29 若有以下程序 #include stdio h int*f(int*s, int*t) int*k; if(*s *t) k=s; s=t; t=k; return s; main() int i=3, j=5, *p=&i, *q=&j, *r; r=f(p, q); pfintf(“ d, d, d, d, d n“, i, j, *p, *q, *r); 则程序的输出结果是 ( A) 3, 5, 5, 3, 5 ( B) 5, 3, 5, 3, 5 ( C) 5, 3, 3, 5, 5 (
17、D) 3, 5, 3, 5, 5 30 若有以下程序 #include int k=7, m=5; void f(int*S) int*t=&k: s=&t; *s=&m; printf(“ d, d, d, “, k, *t, *s); main() int i=3, *p=&i, *r=&p; f(r); printf(“ d, d, d n“, i, *p, *r; 则程序的输出结果是 ( A) 7, 5, 7, 3, 3, 3, ( B) 7, 5, 7, 3, 5, 7, ( C) 7, 5, 5, 3, 3, 3, ( D) 7, 7, 5, 3, 3, 3, 31 有以下程序 #
18、include int funa(int a, int b) return a+b; int funb(int a, int b)return a-b; int SSS(int(*t)0, int x, int Y)retum(*t)(x, Y); main() inl x: x=sss(fhna, 9, 3); x+=sss(funb, 8, 3); printf(“ d n“, x); 程序运行后的输出结果是 ( A) 17 ( B) 23 ( C) 24 ( D) 22 32 有以下程序 void fun( int*P, int*q) int t; t=*p; *p=*q; *q=t;
19、*q=*p; ) main() int a=0, b=9; fun(&a, &b); printf(“ d d n“, a, b); ) 程序的输出结果是 ( A) 0 0 ( B) 9 9 ( C) 9 0 ( D) 0 9 33 有以下程序 void swap(char*x,char*y) char t; t=*x; *x=*y; *y=t; main() char*s1=“abc“, *s2=“123“; swap(s1, s2); printf(“ s, s n“, s1, s2); 程序执行后的输出结果是 ( A) abc, 123 ( B) 123, abe ( C) 321, c
20、ba ( D) 1bc, a23 34 有以下函数 int fun(char*s)char*t=s; while(*t+); retum(t-s); 该函数的功能是 ( A)比较两个字符串的大小 ( B)计算 s所指字符串的长度 ( C)计算 s所 指字符串占用内存字节的个数 ( D)将 s所指字符串复制到字符串 t中 35 有以下程序 #include void fun(char*P、 +p; printf(“ sha“, *p); ) main() char*a=(“Morning“, “Afternoon“, “Evening“, “Night“); fun(a); 程序的运行结果是 (
21、 A) fiemoon ( B) Morning ( C) orning ( D) Afternoon 36 有以下程序 #include void fun(char*a,char*b) 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 37 有以下程序 #include #include void fun(char S10, int n) char t; int ij; for(i=
22、0; i n-1; i+) for(j=i+1; j n; j+) if(si0 sj0)t=si0; si0=sD0; sj0=t; ) main() char ss510=“bcc“, “bbcc“, “xy“, “aaaacc“, “aabcc“); fun(ss, 5); printf(“ s, s n“, ss0, ss4); 程序的运行结果是 ( A) aaaacc, xy ( B) bcc, aabcc ( C) xy, aaaacc ( D) aabcc, bcc 38 有以下程序 #include #include void fun(char*w, int m) char s
23、: *p1, *p2; p1=w, p2=w+m-1: while(p1 p2)s=*p2; *p2=*p2; *p2=s; p1+; p2-; main() char a=“123456“; fun(a, strlen(a); puts(a); ( A) 116611 ( B) 161616 ( C) 654321 ( D) 123456 39 有以下程序 #include #include void fun(int*p1, int*p2, int*s) s=(int*)calloc(1, sizeof(int); *s=*p1+*p2; free(s); main() int a2=1,
24、2, b2=40, 50, *q=a; fun(a, b, q); printf(“ d n“, *q); 程序运行后的输出结果是 ( A) 41 ( B) 42 ( C) 0 ( D) 1 国家二级 C语言机试(编译预处理和指针)模拟试卷 2答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话 S(a+b)-PT*a+b*a+b=3 5*1+2*1+2=7 5。 【知识模块】 编译预处理和指针 2 【正确答案】 B 【试题解析】 这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏 S(x),当
25、在主函数中用参数 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。 【知识模块】 编译预处理和指针 4 【正确答案】 D 【试题解析】 在本题中,定义了 3个宏定义语句,分别是 : #defineN5、 #define M
26、N+5和 #define f(x)(x*M),所以根据 C语言的宏替换规则,我们可知,f(2)=2*N+1=2*5+1=11, f(1+1)=1+1*N+1=l+1*5+1=7。 【知识模块】 编译预处理和指针 5 【正确答案】 D 【试题解析】 在 C语言中,凡是以 “群 ”号开头的行,都称为 “编译预处理 ”。其含义是在 C编译程序对 C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由 #define定义的宏就是编译预处理命令。 C程序在进行编译 之前,都要先对程序中所有出现的 “宏名 ”,都用宏定义中的替换文本进行替换。 【知识模块】 编译预处理和指针 6 【正确
27、答案】 B 【试题解析】 宏展开以后 NUM为 (2+1+1)*2+1 2,计算以后值为 8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。 【知识模块】 编译预处理和指针 7 【正确答案】 A 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以 “撑 ”号开始,每行的末尾不能用 “; ”号结束,以区别于 C语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。 【知识模块】 编译预处理和指针 8 【正确答案】 C 【试题解析】 #include文件包
28、含命令,使用时应注意以下 5个规则: 包含文件的 #include命令行通常应书写在所用源程序文件的开头,故有时也把包含文件称作 “头文件 ”。头文件名可以由用户指定,其后缀不一定用 “ h”。 包含文件中,一般包含有一些公用的 #define命令行、外部说明或对 (库 )函 数的原型说明。 当包含文件修改后,对包含该文件的源程序必须重新进行编译连接。 在一个程序中,允许有任意多个 #include命令行。 在包含文件中还可以包含其他文件。 【知识模块】 编译预处理和指针 9 【正确答案】 B 【试题解析】 a-b=c=(int*)mallet(sizeo(int);含义为申请了一个整型的存储
29、空间,让指针 a,b,c分别指向它, *a=1; *b=2; *c=3;语句的含义为所申请的整型存储空间的内容, *c=3最后执行导致存储空间的内容为 3。 a=b的含义让指针 a也指向指针 b所指向的存储空间, a,b,c都指向整型的存储空间,里边的内容为 3。 【知识模块】 编译预处理和指针 10 【正确答案】 A 【试题解析】 ANSIC标准规定 malloc函数返回值的类型为 void*。使用形式为: malloc(size),其中 size的类型为 unsigned int。 malloc函数用来分配 size个字节的存储区,返回一个指向存储区首地址的基类型为 void的地址。若没有
30、足够的内存单元供分配,函数返回空 (NULL)。可以通过强制类型转换将返回值转 换为需要类型的地址。 【知识模块】 编译预处理和指针 11 【正确答案】 B 【试题解析】 函数指针的定义形式是:数据类型标识符 (*指针变量名 )():void(*pf)()定义了一个没有返回值的函数指针 pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给 pf给赋值时,把函数名 fun赋给 pf即可。 【知识模块】 编译预处理和指针 12 【正确答案】 C 【试题解析】 指针变量定义形式为: 类型 *指针变量名; 其中 *号的个数决定了几级指针,指 针变量赋地址值的方式有 3种方式: 通过求地址
31、运算符 (&)获得地址值 通过指针变量获得地址值 通过标准函数获得地址值 另外 NJLL是在 stdio h头文件中定义的预定义符。 NULL的代码值为 0。可以给指针变量赋 NJLL值。例如 p=NULL;赋值语句,称 p为空指针。这条语句等价于 p= 0;或 p=0;这时,指针 p并不是指向地址为 0的存储单元,而是具有一个确定的值 “空 ”。 【知识模块】 编译预处理和指针 13 【正确答案】 A 【试题解析】 函数 func为返回值为指针的函数,有两个形参,形参数组 a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a10写成 a或 *a效果完全一样。 【知识模
32、块】 编译预处理和指针 14 【正确答案】 D 【试题解析】 指针变量的值只能是存储单元地址,而不能是一个整数,选项 D)的描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio h中, NULL被定义为 void型的指针。 【知识模块 】 编译预处理和指针 15 【正确答案】 B 【试题解析】 在主函数定义了 3个整数指针变量 p,q,r,并且使 p指向 m, q指向 n,再执行 r=p; p=q; q=r;这三条语句,使 q指向 m, p指向 n,再输出变量m,n, *p, *q时,它们值分别为 1
33、,2,2,1。 【知识模块】 编译预处理和指针 16 【正确答案】 D 【试题解析】 语句 *s: a,使用指针变量 s指向一维数组 a的首地址,所以 *(s+3)表示的是引用数组 a3。 【知识模块】 编译预处理和指针 17 【正确答案】 A 【试题解析】 定义语句 int a23, *p3;定义了整型二维数组 a23和指针数组 p3。在 C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。所以选项 A)中,把整型数组 a0的指针赋给 p0。 【知识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 主函数中指针变量 p指向数组 a中下标为 0的元素,
34、k指向 p,那么 *(p+)的值为 2, p指向数组中下标为 1的元素, k指向 p,所以 *k的值为 4。 【知识模块】 编译预处理和 指针 19 【正确答案】 D 【试题解析】 因为小写字符 a,b,c的 ASCII的值分别为 97, 98, 99,而在 do while循环语句中,每次对字符的 ASCII的值取余数并输出,第一次循环输出 7,第二次循环输出 8,第三次循环输出 9。 【知识模块】 编译预处理和指针 20 【正确答案】 A 【试题解析】 选项 A)表示在程序中,声明定义变量语句 “intn,*p=NULL; ”定义了整型变量 n和指针变量 p,并且指针变量 p初始化为空。其
35、他的语句都是错误的。其中选项 B), &n的地址应存放到指针 变量 p中,而选项 C)中数据输入项错误,选项 D)输出地址信息。 【知识模块】 编译预处理和指针 21 【正确答案】 A 【试题解析】 本题考查指针的调用。 x代表 x10数组的首地址指针, pt是指向x10数组的首地址的指针,即两者指向同一内存单元。 +(x+3)等同于 x3。 【知识模块】 编译预处理和指针 22 【正确答案】 B 【试题解析】 函数 fun的主要功能是把字符串 “STRING“,存放到字符数组 a中, s指向该字符串,函数调用结束以后,释放 s和 a指向的空间。主函数 调用fun(p),并不能更改 p的值,因
36、此 p的指向没有改变。 【知识模块】 编译预处理和指针 23 【正确答案】 B 【试题解析】 函数 fun的主要功能是计算字符串中实际字符的个数,因此“goodbey!“含有字符为 8,返回值为 8。 【知识模块】 编译预处理和指针 24 【正确答案】 B 【试题解析】 void f(int *q)函数的功能是对 (*q)的值连续 5次自加 1。在 main()函数中 f(a)语句把一维数组 a5】的首地址作为实参,传递给函数 f(int*q)的形参 q,然后 在函数 f(int*q)内, a0连续 5次自加 1后, a0的值就变成 6。所以输出为6, 2, 3, 4, 5。 【知识模块】 编
37、译预处理和指针 25 【正确答案】 A 【试题解析】 本题考查判断语句与循环语句。欲使每行输出 8个数据,则必然使用取余运算,当 i 8=0时先输出一个换行符再输出字符。选项 D)中, continue语句的作用是停止执行本次循环位于 continue后面的语句,而进入下一次循环。 【知识模块】 编译预处理和指针 26 【正确答案】 B 【试题解析】 本题考查函数的 调用与指针。 fun()函数的作用是:使指针 p指向原来所指变量的下一个变量,使 q指针指向的值加 1。主函数中,指针 r指向 m,调用 fun()函数的结果是,使 r指向地址位于 m后面的变量,使位于 n的地址上的变量 (就是
38、n)的值加 1,因此,结果为 1, 3。 【知识模块】 编译预处理和指针 27 【正确答案】 C 【试题解析】 函数 void f(int b)的功能是对数组 b中第 2个到第 5个元素的值逐个扩大 2倍。所以在 main()函数中, f(a)语句的作用是对数组 a10中从 a2到a5的各个数 字乘以 2,因而数组 a10的元素就变成了 1, 2, 6, 8, 10, 12, 7,8, 9, 10)。 【知识模块】 编译预处理和指针 28 【正确答案】 B 【试题解析】 主函数中定义指针变量 p指向 k,调用函数 sp(p),将 k的地址传递给形参指针 a,函数转到 sp运行, a指向 b的地
39、址,表达式 *a=*a*2,相当于b=b*2,得到 *a的数据 4输出。函数调用结束,此时 a和 b的空间撤销,而对实参k和 p的值并没有改变,仍旧是 3。 【知识模块】 编译预处理和指针 29 【正确答案】 D 【试题解 析】 本题考查了返回值为指针的函数,函数 f的主要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中 p指向 i, q指向 j,调用 r=f(p,q),返回 q的地址,因此 *p=3, *q=5, *r=5。 【知识模块】 编译预处理和指针 30 【正确答案】 C 【试题解析】 本题考查二级指针作为函数
40、的参数,可以通过函数调用来改变主函数中一级指针的指向。主函数中指针变量 p指向 i, r指向 p,调用 f函数,形参指针 s指向 p,流程转到 f函数执行 ,指针变量 t指向 k, s指向 t,此时更改了 s的指向,指向了 t,更改了 s指向的地址空间内容为 m的地址,同时 t也指向变量m,因此 *s的值为 m的值, *t为 m的值, k为 7。流程返同到主函数,没有对主函数空间的数据和指向作出更改,因此全部为 3。 【知识模块】 编译预处理和指针 31 【正确答案】 A 【试题解析】 函数 funa的功能计算两个数据的和, funb的功能计算两个数据的差,函数 sss中利用指向函数的指针作为
41、函数的参数,可以在调用的时候,根据接收的函数地址来决定调用那一个函数。主函数中调用 x=sss(funa, 9,3),将 funa函数的地址传递给 t,因此 sss函数成为求两个数据的和 12,继续将 funb函数地址传给 t,求两个数据差为 5,和 s累加后结果为 17。 【知识模块】 编译预处理和指针 32 【正确答案】 B 【试题解析】 函数 fun的主要功能是交换 p和 q指向的地址空间的数据,然后更改 p的指向的地址空间数据,使之和 q指向的数据相同。主函数调用 fun后, p指向 a, q指向 b,因此 a和 b的数据全部为 9。 【知识模块】 编译预处理和指针 33 【正确答案】
42、 D 【试题解析 】 函数 void swap(char*x, char*y)的功能是交换两个字符 *x和 *y中的内容。在主函数中字符指针 s1指向字符串 abc, s2指向字符串 123。所以函数swap(s1, s2)的执行结果就是字符 a和 1相互交换。 【知识模块】 编译预处理和指针 34 【正确答案】 C 【试题解析】 在函数 fun(char*s)中,首先用字符指针变量 t指向 s,而循环语句while(*t+);的功能是使指针变量 t指向字符串变量 s的末尾,这时退出循环,因而语句 return(t-s);返 回的就是字符串 s所指字符串的长度。 【知识模块】 编译预处理和指针
43、 35 【正确答案】 D 【试题解析】 在程序中,指针的指针变量 a和 p都是指向字符串的指针。执行fun(a)语句时, p指向的是字符串数组 a的第一个字符串 “Morning”, p自加 l之后, *p指向了字符串数组 a的第 2个字符串 “Afternoon”。 【知识模块】 编译预处理和指针 36 【正确答案】 C 【试题解析】 主函数 main()定义了指向字符串的指针和一个字符数组,接着调用fun(s, t)函数,进行实参向 形参传递,函数 fun()第一个 while语句判断 *a中的值为 “*”时继续扫描,当遇到不是 “*”时结束,接着第二个 while循环语句,将 *a中从
44、“a”开始的后续所有字符都赋予 *b,也就是 t80中的内容为 “a*b*”。 【知识模块】 编译预处理和指针 37 【正确答案】 C 【试题解析】 函数 fun(char s10,int n)通过两重 for循环语句,比较二维字符数组 s10的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首 字符。在主函数中,语句 fun(ss,5)的作用是对二维字符数组 ss510的 5个字符串的首字符进行从小到大的排序,不影响各个字符串另外的字符。所以排序结束后, 5个字符串的第一个字符依次变为 a、a、 b、 b和 x:最后输出第个和第 4个字符串。 【知
45、识模块】 编译预处理和指针 38 【正确答案】 C 【试题解析】 函数 fun的功能是将字符串 w中的元素从大到小进行排列,所以在主函数中调用函数 fun后,字符串 a的元素从大到小进行了排列。 【知识模块】 编译预处理和指针 39 【正确答案】 A 【试题解析】 主函数定义数组 a, b, q指向数组 a,调用 fun函数以后形参接收实参的数据, p1和 p2指向数组 a和 b,同时 s指向数组 a,在 fun函数中改变了 s的指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于 s的指向改动不会对主函数参数构成影响。因此主函数中数去 *q的值仍然为 1。 【知识模块】 编译预处理和指针
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1