1、国家二级 C语言机试(指针)模拟试卷 4及答案与解析 一、选择题 1 有以下程序 #include int fun( char s ) char *p = s; while( *p != 0 ) p+; return ( p-s ); main() printf(“%dn“, fun(“0ABCDEF“) ); 程序运行后的输出结果是( )。 ( A) 7 ( B) 6 ( C) 1 ( D) 0 2 若有以下程序段 char str412= “aa“,“bbb“,“ccccc“,“d“ , *strp4; int i; for( i = 0; i #include void fun ( ch
2、ar *s ) char a10; strcpy( a, “STRING“ ); s = a; main() char *p=“PROGRAM“; fun( p ); printf(“%sn“,p); 程序运行后的输出结果是(此处 代表空格 ) ( )。 ( A) PROGRAM ( B) STRING ( C) STRING ( D) STRING 4 有以下程序 #include main() char c25=“6938“,“8254“ , *p2; int i, j, s=0; for( i=0; i0 ; j+=2 ) s=10*s+pij-0; printf(“%dn“,s); 程
3、序运行后的输出结果是( )。 ( A) 6385 ( B) 9824 ( C) 6982 ( D) 9284 5 下面选项中的程序段,没有编译错误的是( )。 ( A) char* sp, s10; sp = “Hello“; ( B) char* sp, s10; s = “Hello“; ( C) char str110 = “computer“, str210; str2 = str1; ( D) char mark; mark = “PROGRAM“; 6 以下叙述中正确的是( )。 ( A)字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组 ( B) char ca35 =
4、 “A“, “BB“, “CCC“; 是不合语法的 ( C) char ca 5 = “A“, “BB“, “CCC“; 是不合语法的 ( D) char *ca3 = “A“, “BB“, “CCC“; 是不合语法的 7 以下叙述中正确的是( )。 ( A)函数名代表该函数的入口地址 ( B)所有函数均不能接受函数名作为实参传入 ( C)函数体中的语句不能出现对自己的调用 ( D)如果函数带有参数,就不能调用自己 8 在 32位编译器上,设有定义 char *str1 = “Hello“, str2 = “Hello“; , 则以下语句 printf(“%d %d“, sizeof(str1
5、), sizeof(str2); 的输出结果是( )。 ( A) 4 6 ( B) 5 5 ( C) 6 6 ( D) 5 6 9 以下叙述中正确的是( )。 ( A)函数既可以直接调用自己,也可以间接调用自己 ( B)任何情况下都不能用函数名作为实参 ( C)函数的递归调用不需要额外开销,所以效率很高 ( D)简单递归不需要明确的结束递归的条件 10 设有定义语句: char *aa2= “abcd“,“ABCD“; 则以下叙述正确的是( )。 ( A) aa0存放了字符串 “abcd“的首地址 ( B) aa数组的两个元素只能存放含有 4个字符的一维数组的首地址 ( C) aa数组的值分别
6、是字符串 “abcd“和 “ABCD“ ( D) aa是指针变量,它指向含有两个元素的字符型数组 11 有以下程序 #include int fun( char *s ) char *p=s; while (*p !=0 ) p+; return ( p-s ); main() printf( “%dn“, fun( “goodbey!“ ) ); 程序的输出结果是( )。 ( A) 8 ( B) 6 ( C) 0 ( D) 7 12 有以下程序 #include main() char c25= “6934“, “8254“ ,*p2 ; int i, j, s=0; for( i=0; i
7、0 int k=0, a=0 ; while( s k +1 ) k+; if ( k % 2 =0 ) a = a + ( s k - 0 +1 ) ; continue; a = a + ( s k - 0 ); printf (“ k=%d a=%dn“, k, a ); 程序运行后的输出结 果是( )。 ( A) k=4 a=12 ( B) k=5 a=15 ( C) k=6 a=11 ( D) k=3 a=14 14 有以下程序(其中库函数 strstr()首部格式为: char *strstr(char *p1, char *p2) 其功能是确定 p2字符串是否在 p1中出现,并返
8、回 p2第一次出现的字符串首地址) #include #include char *a=“you“; char *b=“Welcome you to Beijing!“; main() char *p; p = strstr(b, a); printf(“%sn“, p); 程序的运行结果是( )。 ( A) you to Beijing! ( B) to Beijing! ( C) Welcome you to Beijing! ( D) Beijing! 15 有以下程序(其中的 strstr()函数头部格式为: char *strstr(char *p1, char *p2) 确定 p2
9、字符串是否在 p1中出现,并返回 p2第一次出现的字符串首地址) #include #include char *a=“you“; char *b=“Welcome you to Beijing!“; main() char *p; p = strstr(b, a) + strlen(a) + 1; printf(“%sn“, p); 程序的运行结果是( )。 ( A) to Beijing! ( B) you to Beijing! ( C) Welcome you to Beijing! ( D) Beijing! 16 有以下说明语句 char *s = “NameAddressn“;
10、指针 s所指字符串的长度是( )。 ( A) 14 ( B) 15 ( C) 17 ( D)说明语句不合法 17 有以下程序 #include main() char *s6 = “ABCD“, “EFGH“,“IJKL“,“MNOP“,“QRST“,“UVWX“ , *p ; int i; p = s; for( i = 0; i #include main() char a = “THIS“, *b = “OK“; printf(“%d,%d,%d,%dn“, strlen(a), sizeof(a), strlen(b), sizeof(b); 程序运行后的输出结果是( )。 ( A)
11、4,5,2,4 ( B) 4,4,2,1 ( C) 5,5,3,3 ( D) 4,5,2,3 22 有如下程序 #include #include main() char name10 = “c-book“; char* str = name; printf(“%d,%d,%d,%dn“, sizeof(name), strlen(name), sizeof(str), strlen(str); 程序运行后的输出结果是( )。 ( A) 10,6,4,6 ( B) 11,6,11,6 ( C) 11,6,1,6 ( D) 10,7,1,7 23 有如下程序 #include int disp(
12、char* str) while (*str) putchar(*str+); return *str; main() printf(“%dn“, disp(“NAME“); 程序运行后的输出结果是( )。 ( A) NAME0 ( B) NAMEE ( C) NAME ( D) NAME0 24 有如下程序 #include main() char *p, old_str10 = “wind“; int password; scanf(“%d“, p = old_str; while (*p) printf(“%c“, *p + password); p+; printf(“n“); 程序运
13、行时,从键盘输入 2,输出结果是( )。 ( A) ykpf ( B) wind ( C) xjoe ( D) 2222 25 有如下程序 #include int sum(int* array, int len) if (len = 0) return array0; else return array0 + sum(array+1, len-1); main() int array5 = 1,2,3,4,5; int res = sum(array, 4); printf(“%dn“, res); 程序运行后的输出结果是( )。 ( A) 15 ( B) 10 ( C) 8 ( D) 1
14、26 以 下能正确进行字符串赋值的语句组是( )。 ( A) char *ch; ch=“abc“; ( B) char ch =a,b,c; ( C) char ch3=“abc“; ( D) char ch4; ch=“abc“; 27 有以下程序 #include int fun(char *s) char *p=s; while( *p+ != 0); return(p-s); main() char *p=“01234“; printf(“%dn“,fun(p); 程序的运行结果是( )。 ( A) 6 ( B) 5 ( C) 4 ( D) 3 28 有以下程序 #include m
15、ain() char s10=“verygood“, *ps=s; ps+=4; ps=“nice“; puts(s); 程序的运行结果是( )。 ( A) verygood ( B) verynice ( C) nicegood ( D) nice 29 有以下程序 #include int fun(char *s) char *p=s; while( *p != 0) p+; return(p-s); main() char *p=“01234“; printf(“%dn“,fun(p); 程序的运行结果是( )。 ( A) 5 ( B) 6 ( C) 4 ( D) 3 30 有以下程序
16、#include #include void fun(int *p1, int *s) int *t; t=(int *)malloc(2 * sizeof(int); *t=*p1 + *p1+; *(t+1)=*p1+ *p1; s=t; main() int a2=1,2,b2=0; fun(a,b); printf(“%d,%dn“,b0,b1); 程序运行后的输出结果是( )。 ( A) 0,0 ( B) 2,6 ( C) 2,4 ( D) 1,2 31 有以下程序 #include #include int fun(int n) int *p; p = (int*)malloc(s
17、izeof(int); *p=n; return *p; main() int a; a = fun(10); printf(“%dn“,a+fun(10); 程序的运行结果是( )。 ( A) 20 ( B) 10 ( C) 0 ( D)出错 32 有以下程序 #include main() char c25=“6938“,“8254“ , *p2; int i, j, s=0; for( i=0; i0 ; j+=2 ) s=10*s+pij-0; printf(“%dn“,s); 程序运行后的输出结果是( )。 ( A) 6385 ( B) 9824 ( C) 4528 ( D) 693
18、8 33 有以下程序 #include #include void fun( double *p1,double *p2,double *s) s = (double *)calloc( 1,sizeof(double) ); *s = *p1 + *( p2+1 ); main() double a2 = 1.1, 2.2 , b2 = 10.0, 20.0 , *s=a; fun( a, b, s ); printf( “%5.2fn“, *s); 程序的输出结果是( )。 ( A) 1.10 ( B) 11.10 ( C) 12.10 ( D) 21.10 34 有以下程序 #inclu
19、de #include void fun( int *p1, int *p2, int *s) s=( int*)calloc(1,sizeof(int); *s=*p1+*p2; free(s); main() int a2=1,2, b2=40,50,*q=a; fun(a,b,q); printf(“%dn“, *q); 程序运行后的输出结果是( )。 ( A) 1 ( B) 41 ( C) 42 ( D) 0 国家二级 C语言机试(指针)模拟试卷 4答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 函数 fun()中的 while循环的逻辑是如果指针 p没有到达字符串末端,则
20、指针 p一直向后移动。循环结束的时候, *p=0,数组名 s为一指针常量,始终指向字符数组的首地址,所以 p-s则返回的是字符数组 s中有的字符个数,所以输出结果为 7,答案选 A。 【知识模块】 指针 2 【正确答案】 A 【试题解析】 指针 strp为一个指针数组, str为一个二维数组名。语句 “strpi = stri;“将 str数组中第 i+1个字符串的首地址赋值给 strpi,所以 stri与 strpi、*(strp+i)、 *(str+i)等价,选项 B)、 C)、 D)正确,而 strp为指针数组所占内存的首地址,不能引用字符串,所以答案选 A)。 【知识模块】 指针 3
21、【正确答案】 A 【试题解析】 函数的参数传递过程中,形参只是实参的一个副本,如果形参和实参为两个地址,则形参指针指向的变化不能影响到实参指针的指向。所以该函数fun()调用中,并不能改变实参 p的指向,输出结果为 “PROGRAM“,答案选 A。 【知识模块】 指针 4 【正确答案】 A 【试题解析】 第一个 for循环将数组中每个字符串的首地址赋值给了指针数组 p的元素,所以 pij与 cij等价。第二个嵌套 for循环中外层循环 i从 0到 1,内层循环 j为偶数且从 0递增,语句 “s=10*s+pij- ?0?;“用一个整数 s记录数组 c中列下标为偶数的所有数字,并按照其先后顺序放
22、置于整数 s的不同位上,所以计算得到的结果为 6385,答案选 A。 【知识模块】 指针 5 【正确答案】 A 【试题解析】 字符数组名为一个指针常量,在非定义状态下,不能进行任何赋值性操 作,所以不能通过赋值操作将一个字符串的地址指给它,也不能一个字符数组的地址指给另一个字符数组名,选项 B)、 C)、 D)错误;但是可以通过赋值的方式把一个字符串地址指给一个字符指针,选项 A)正确;答案选 A)。 【知识模块】 指针 6 【正确答案】 A 【试题解析】 多个字符串可以使用二维字符数组存放,但是每个字符串的长度不能超过二维数组的第二维的维数。在定义二维数组时,第一维的数字可以省略,所以选项
23、B)、 C)、 D)中定义字符串数组的语句都是合法的,答案选 A)。 【知识模块】 指针 7 【正确答案】 A 【试题解析】 函数名也是一个地址,为该函数的入口,选项 A)正确;函数名可以作为实参,实际传递的是该函数的返回值,选项 B)错误;在函数体中可以调用自身,这种函数称为递归函数,选项 C)错误;递归函数也有带参数和不带参数的,选项 D)错误;答案选 A)。 【知识模块】 指针 8 【正确答案】 A 【试题解析】 sizeof(str1)求的是一个指针占用字节数,在 32位的计算机上规定一个指针变量占用的内存为 32位,即 4个字节,所以第一个输出结果为 4;sizeof(str2)求的
24、是 字符数组 str2占用内存,包含字符串结束标识符 ?0?,所以第二个输出结果为 6。答案选 A。 【知识模块】 指针 9 【正确答案】 A 【试题解析】 函数之间可以嵌套调用,选项 A)描述正确;函数名可以作为实参,实际传递的是该函数的返回值,选项 B)错误;递归调用也是函数调用,每次调用的时候也需要记录每一层的返回点,也要增加许多额外的开销的,选项C)错误;递归调用和循环很相似,为了防止递归调用无休止地进行,必须在函数内添加明确的结束条件,选项 D)错误;答案选 A)。 【知识模块】 指针 10 【正确答案】 A 【试题解析】 *aa2为一个指针数组,存放多个字符串时 aai记录的是第
25、i+1个字符串的首地址,选项 A)正确;并且该指针数组和 aa2等价,第一维数字没有写明的话可以存放任意长度的字符串,选项 B)错误; aa数组中存放的是两个基类型为 char型的指针,而不是字符串,选项 C)错误; aa是指针常量,选项D)错误;所以答案选 A)。 【知识模块】 指针 11 【正确答案】 A 【试题解析】 函数 fun()中的 while循环的逻辑是如果指针 p没有到达字符串末端,则 指针 p一直向后移动。循环结束的时候, *p=?0?,数组名 s为一指针常量,始终指向字符数组的首地址,所以 p-s则返回的是字符数组 s中有的字符个数(不包含结束标识符),所以输出结果为 8,
26、答案选 A。 【知识模块】 指针 12 【正确答案】 A 【试题解析】 第一个 for循环将数组中每个字符串的首地址赋值给了指针数组 p的元素,所以 pij与 cij等价。第二个嵌套 for循环中外层循环 i从 0到 1,内层循环 j为偶数且从 0递增,语句 “s=10*s+pij- ?0?;“用一个整数 s记 录数组 c中列下标为偶数的所有数字,并按照其先后顺序放置于整数 s的不同位上,所以计算得到的结果为 6385,答案选 A。 【知识模块】 指针 13 【正确答案】 A 【试题解析】 while循环的条件为 sk+1不为 ?0?,循环开始即让 k自加 1,相当于 s+k不为 ?0?。所以
27、遍历 s指向的字符串除首位元素的之后的字符串, a累加s指向字符串中每个元素对应的数字,若元素下标为偶数则多加 1。字符串后 4位元素 “2134“中下标为偶数的元素个数为 2,所以 a=2+1+3+4+2=12, k记录的是统计的 元素个数,为 4,所以答案选 A。 【知识模块】 指针 14 【正确答案】 A 【试题解析】 语句 “p = strstr(b, a);“将指针 p指向了字符串 “you“在 b指向字符串中第一次出现的字符串首地址,即是 “返回的是字符串 “you“在 b指向的字符串中第一次出现的字符串首地址,即是 “计算得的 p与 “会将该字符串整体输出。所以 main()函数
28、输出的为字符串数组 s的前 4个字符串,答案选 A。 【知识模块】 指针 18 【正确答案】 A 【试题解析】 指针 strp为一个指针数组, str为一个二维数组名。语句 “strpi = stri;“将 str数组中第 i+1个字符串的首地址赋值给 strpi,所以 stri与 strpi、*(strp+i)、 *(str+i)等价,选项 B)、 C)、 D)正确,而 strp为指针数组所占内存的首地址,不能引用字符串,所以答案选 A)。 【知识模块】 指针 19 【正确答案】 A 【试题解析】 语句 “p=str;“将指针 p指向了数组 str的首地址,所以 stri与pi、 *(p+i
29、)、 *(str+i)等价。 *(p+5)即等价于 str5,为 0,答案选 A)。 【知识模块】 指针 20 【正确答案】 A 【试题解析】 数组名表示该数组的首地址,是一个地址常量,不能对它重新赋值,选项 B)、 C)、 D)错误,答案选 A)。 【知识模块 】 指针 21 【正确答案】 A 【试题解析】 strlen()计算的是字符串的实际长度(不包含结束标识符),所以strlen(a)的结果为 4, strlen(b)的结果为 2。 sizeof(a)求的是字符数组 a占用内存,包含字符串结束标识符 ?0?,计算结果为 5, sizeof(b)求的是一个指针占用字节数,在 32位的计算
30、机上规定一个指针变量占用的内存为 32位,即 4个字节,所以计算结果为 4。答案选 A。 【知识模块】 指针 22 【正确答案】 A 【试题解析】 strlen()计算的是字 符串的实际长度(不包含结束标识符),所以strlen(name)和 strlen(str)的结果为均为 6。 sizeof(name)求的是字符数组 a占用内存,数组 a在定义时标明了维数为 10,所以计算的结果为 10; sizeof(str)求的是指针 str占用字节数,在 32位的计算机上规定一个指针变量占用的内存为 32位,即4个字节,所以计算的结果为 4。答案选 A。 【知识模块】 指针 23 【正确答案】 A
31、 【试题解析】 函数 disp()的功能是不断输出 str指向的字符串中的字符,直到指针 str指向该字 符串的尾部 0,并返回当前字符的 ASCII码值。 main()函数中会输出该 ASCII码值,字符 0的 ASCII码值为 0,所以输出结果为选项 A)。 【知识模块】 指针 24 【正确答案】 A 【试题解析】 这段代码的作用是给一个字符串加密,加密的方式是将原先字符串的每个字符的 ASCII码加上 password,即相当于在 ASCII码表上取距离当前字符为 password的字符作为加密后的字符,所以答案选 A。 【知识模块】 指针 25 【正确答案】 A 【试题解析】 函数 s
32、um()的作用是计算数组 array中元素下标为 len到 0的所有元素的和,所以答案选 A。 【知识模块】 指针 26 【正确答案】 A 【试题解析】 通过赋初值的方式把一个字符串赋给字符数组必须要在字符串的末尾加上结束标识符 0,没有 0的不能判定该字符数组存放的是字符串,选项 B)错误;用字符数组存放字符串的时候,字符数组的元素个数至少要比存放的字符串长度要多 1,因为结束标识符也会被写入到字符数组中,选项 C)错误;数组名为地址常量,不能对其进行赋值性操作,选项 D)错误。答案选 A)。 【知识模块】 指针 27 【正确答案】 A 【试题解析】 函数 fun()中的 while循环的逻
33、辑是如果 *p不为 ?0?,则指针 p一直向后移动。循环结束的时候, p指向的是字符 ?0?的下一位,数组名 s为一指针常量,始终指向字符数组的首地址,所以 p-s则返回的是字符数组 s中有的字符个数(包含结束标识符),所以输出结果为 6,答案选 A。 【知识模块】 指针 28 【正确答案】 A 【试题解析】 数组名 s为一个指针常量,始终指向该数组的首地址,语句“ps=“nice“;“将字符指针 ps指向了 另一个字符串的首地址,并不能对字符数组 s中的数据造成影响,所以输出结果为 “verygood“,答案选 A。 【知识模块】 指针 29 【正确答案】 A 【试题解析】 函数 fun()
34、中的 while循环的逻辑是如果 *p不为 ?0?,则指针 p一直向后移动。循环结束的时候, p指向的是字符 ?0?,数组名 s为一指针常量,始终指向字符数组的首地址,所以 p-s则返回的是字符数组 s中有的字符个数(不包含结束标识符),所以输出结果为 5,答案选 A。 【知识模块】 指针 30 【正确答案】 A 【试 题解析】 函数调用时的参数传递过程中,形参只是实参的一个副本,如果形参和实参为两个地址,则形参指针指向的变化不能影响到实参指针的指向。函数fun()中先给 t分配一个空间并用指针 p1给 t中元素赋值,之后将指针 t指向的地址赋值给了指针 s,只是改变了 s的指向而没有改变 s
35、指向内存中元素的值,所以调用结束后 b中元素没有变化,答案选 A。 【知识模块】 指针 31 【正确答案】 A 【试题解析】 函数 fun()的功能是新分配一个存储空间并把 n的值存入该存储空间内,同时返回该存储空间记录的值 *p,也即是 n, 所以 a=fun(10)=10,输出“a+fun(10)“的结果为 20,答案选 A。 【知识模块】 指针 32 【正确答案】 A 【试题解析】 第一个 for循环将数组中每个字符串的首地址赋值给了指针数组 p的元素,所以 pij与 cij等价。第二个嵌套 for循环中外层循环 i从 0到 1,内层循环 j为偶数且从 0递增,语句 “s=10*s+pi
36、j- ?0?;“用一个整数 s记录数组 c中列下标为偶数的所有数字,并按照其先后顺序放置于整数 s的不同位上,所以计算得到的结果为 6385,答案选 A。 【知识模块】 指针 33 【正确答案】 A 【试题解析】 函数 fun()的功能是用 calloc()函数重新分配了 1个长度为sizeof(double)的连续空间并把返回的内存地址赋值给 s,之后对往新分配的内存中写入数据。由于函数传递过程中形参指针指向的变化不能影响到实参指针的指向,所以函数 fun()并不能改变 s的指向, *s与 a0等价,格式输出的结果为 1.10,答案选 A。 【知识模块】 指针 34 【正确答案】 A 【试题解析】 函数 fun()的功能是改变了指针 s的指向。 由于函数传递过程中形参只是实参的一个副本,形参指针指向的变化不能影响到实参指针的指向,所以函数 fun()并不能改变实参 q的指向, *q仍与 a0等价,输出的结果为 1,答案选A。 【知识模块】 指针
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1