1、国家二级 C语言机试(指针)模拟试卷 1及答案与解析 一、选择题 1 以下叙述中正确的是( )。 ( A) int* p1; int * p2; int *p3;都是合法的定义指针变量的语句 ( B)指针变量只能通过求地址运算符( 与 p=0;是等价的语句 ( D)语句 p=NULL;执行后,指针 p指向地址为 0的存储单元 2 以下叙述中正确的是( )。 ( A)如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息 ( B)即使不进行强制类型转换,在进 行指针赋值运算时,指针变量的基类型也可以不同 ( C)设变量 p是一个指针变量,则语句 p=0;是非法的,应该使用 p=NULL;
2、 ( D)指针变量之间不能用关系运算符进行比较 3 以下叙述中正确的是( )。 ( A)在对指针进行加、减算术运算时,数字 1表示 1个存储单元的长度 ( B)如果 p是指针变量,则 *p表示变量 p的地址值 ( C)如果 p是指针变量,则 则以下叙述中正确的是( )。 ( A)语句 a = 是非法的 ( B)表达式 a+1 是非法的 ( C)三个表达式 a1、 *(a+1)、 * p = for( x=0; x main() int a = 10,20,30,40 , *p=a, i ; for( i=0; i int *f(int *s,int *t) if (*s int add( in
3、t a,int b) return (a+b); main() int k, (*f)(), a=5,b=10; f=add; 则以下函数调用语句错误的是( )。 ( A) k= *f(a,b); ( B) k=add(a,b); ( C) k=(*f)(a,b); ( D) k=f(a,b); 16 有以下程序 #include main() int n,*p=NULL; *p= printf(“Input n:“); scanf(“%d“, printf(“output n:“); printf(“%dn“,p); 该程序试图通过指针 p为变量 n读入数据并输出,但程序有多处错误,以下语句
4、正确的是( )。 ( A) int n,*p=NULL; ( B) *p= ( C) scanf(“%d“, 17 若有定义语句: double a, *p= 以下叙述中错误的是( )。 ( A)定义语句中的 * 号是一个间址运算符 ( B)定义语句中的 * 号是一个说明符 ( C)定义语句中的 p只能存放 double类型变量的地址 ( D)定义语句中 *p= 执行 px= py= 正确的输入语句是( )。 ( A) scanf(“%lf %le“, px, py); ( B) scanf(“%f %f“ ( C) scanf(“%f %f“, x, y); ( D) scanf(“%lf
5、%lf“,x, y); 19 有以下程序 #include main() int m=1,n=2,*p= r=p; p=q; q=r; printf(“%d,%d,%d,%dn“,m,n,*p,*q); 程序运行后的输出结果是( )。 ( A) 1,2,2,1 ( B) 1,2,1,2 ( C) 2,1,2,1 ( D) 2,1,1,2 20 若有以下定义 int x10, *pt=x; 则对 x数组元素的正确引用是( )。 ( A) *(x+3) ( B) * for(i=0;i void f( int *q ) int i=0; for ( ;i int fun(int (*s)4, in
6、t n, int k) int m, i; m=s0k; for(i=1; im) m= sik; return m; main() int a44=1,2,3,4, 11,12,13,14, 21,22,23,24, 31,32,33,34; printf(“%dn“,fun(a,4,0); 程序的运行结果是( )。 ( A) 31 ( B) 34 ( C) 4 ( D) 32 26 有以下程序 #include void fun(char *c,int d) *c=*c+1; d=d+1; printf(“%c,%c,“,*c,d); main() char b=a,a=A; fun( p
7、rintf(“%c,%cn“,b,a); 程序运行后的输出结果是( )。 ( A) b,B,b,A ( B) b,B,B,A ( C) a,B,B,a ( D) a,B,a,B 27 以下函数实现按每行 8个输出 w所 指数组中的数据 #include void fun( int *w, int n) int i; for(i=0;i void fun (char *c) while(*c) if( *c = a pf=fun; ( B) void *pf(); pf=fun; ( C) void *pf(); *pf=fun; ( D) void (*pf)(int,char); pf= 3
8、0 有以下程序 #include void fun(int *s, int n1, int n2) int i, j, t; i=n1; j=n2; while( i main() int a=1, b=3, c=5; int *p1= *p =*p1*(*p2); printf(“%dn“,c); 执行后的输出结果是( )。 ( A) 3 ( B) 2 ( C) 1 ( D) 4 32 有以下程序 #include void f(int *p,int *q); main() int m=1,n=2,*r= f(r, printf(“%d,%d“,m,n); void f(int *p,int
9、 *q) p=p+1; *q=*q+1; 程序运行后的输出结果是( )。 ( A) 1,3 ( B) 2,3 ( C) 1,4 ( D) 1,2 33 若有定义语句: int a23,*p3; 则以下语句中正确的是( )。 ( A) p0= ( B) p0=a; ( C) p=a; ( D) p1= 34 设有定义语句 int (*f)(int); 则以下叙述正确的是( )。 ( A) f是指向函数的指针变量,该函数具有一个 int类型的形参 ( B) f是基类型为 int的指针变量 ( C) f是指向 int类型一维数组的指针变量 ( D) f是函数名,该函数的返回值是基类型为 int类型的
10、地址 35 有以下程序 #include void fun( int *a,int *b) int *c; c=a;a=b;b=c; main() int x=3, y=5, *p= fun(p,q); printf(“%d,%d,“,*p,*q); fun( printf(“%d,%dn“,*p,*q); 程序运行后的输出结果是( )。 ( A) 3,5,3,5 ( B) 3,5,5,3 ( C) 5,3,3,5 ( D) 5,3,5,3 国家二级 C语言机试(指针)模拟试卷 1答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 考查指针变量。指针变量的定义形式为: 类型名 *指针
11、变量名,表示指向某一个变量的指针,如果定义形式为:类型名 *指针变量名,则表示指向某一个指针变量的指针,所以 A)正确。指针变量本身存储的是其指向的变量的地址值,不需要使用求地址运算符( 是将空指针赋给指针变量,表示该指针变量当前未指向任何变量,语句 p=0;本身不正确,两者不等,故选项 C)、 D)错。答案选 A)。 【知识模块】 指针 2 【正确答案】 A 【试题解析】 空指针意味着该指针没有指向任何具体的变量,所以不能访问一个存储单元, A)正确。指针的 赋值运算只能在同一数据类型之间进行,故选项 B)错。语句 p=0和 p=NULL是一样的,都是把一个空指针赋给指针变量 p,故选项C)
12、错。指针之间能进行关系运算,比较的是地址值的大小,选项 D)错。答案选A)。 【知识模块】 指针 3 【正确答案】 A 【试题解析】 考查指针的用法。指针进行算术运算的时候,数字 “1“不再代表十进制整数 “1“,而是指一个存储单元长度, A)正确。指针变量存储的是其指向的变量的地址,其本身的地址仍用取地址运算符 “意味着将指针 p指向数组 a的第二个元素, p+1则是指向数组 a的第三个元素,同理, p+x则是指向数组 a的第 x+2个元素, x取值为 0、 1、 2,然后用 y和对应数组的元素累加, y=1,即是1+2+4+6+8=19,结果选 A)。 【知识模块】 指针 7 【正确答案】
13、 A 【试题解析】 考查指针变量。 p = NULL表示给指针 p赋以空指针, NULL为一个符号常量,代表整数 0,所以答案选 A。 【知识模块】 指针 8 【正确答案】 A 【试题解析】 考查指针变量与一维数组。语句 int *p=a将指针 p指向了数组 a的首地址,所以 p+1与 a+1和 a1等价,每次循环中指针 p移动一位,同时引用数组的索引值 i也自加 1,即 *p和 ai引用的内容一样,将 *p赋值给 ai没有对数组a做任何改变,输出 a2即是 30,答案选 A。 【知识模块】 指针 9 【正确答案】 A 【试题解析】 考查指针变量。指针变量只能存放同类型变量的地址,不能取常量的
14、地址赋值给它,选项 A)正确,选项 B)错误;指针变量指向的是变量的地址,指向指针变量的地址需要用指向指针的指针来存放,选项 C)错误;未赋值的指针变量指向不确定的存储空间,而不是 NULL,选项 D)错误。答案选A)。 【知识模块】 指针 10 【正确答案】 A 【试题解析】 考查指针与函数。被调函数为指针型函数,返回的是 s这一指针型数据。虽然该函数进行的是地址传参,但只是改变了指针的指向,对原指向的数据并没有改变。并且若以指针作为操作单元,不涉及其指向的数据时,该函数仍然可以看做是值传递,即形参指针指向的变化不会影响到实参指针的指向。 if语句将 s指向 *s、 *t较大的数据的地址。所
15、以函数调用结束之后, i、 j值不变, p的指向不变, r的指向和 p的指向一致,输出结果为: 3,5,3,5,5,答案选 A。 【知识模块】 指针 11 【正确答案】 A 【试题解析】 不管什么类型的指针变量,存储的都是被指向变量的地址,即是该变量在内存中的一个存储单元编号,所以所有的指针变量占用的内存大小是相同的,答案选 A。 【知识模块】 指针 12 【正确答案】 A 【试题解析】 在指针运算中, “*“为取值运算符, “表示把空指针赋给指针变量 p,而若要 p指向变量 x的地址需使用“p= “的形式,所以答案选 A。 【知识模块】 指针 13 【正确答案】 A 【试题解析】 不可以把一
16、个 int型数据直接赋值给一个指针变量,只能用取地址运算符 “,选项 D)错误。所以答案选A)。 【知识模块】 指针 17 【正确答案】 A 【试题解析】 在定义指针变量时的 “*“只是一个说明符,说明定义的变量为指针变量,选项 A)说法不正确,答案选 A)。 【知识模块】 指针 18 【正确答案】 A 【试题解析】 scanf函数的一般形式为 scanf(“格式控制字符串 “,输入项 1,输入项2,) ,其中,输入项由地址运算符 “五次,而该语句的执行过程是获取指针 p指向的数据并自加,由于指针 p没有 移动,所以每次获取的都是数组 a第一个元素的值,自加五次之后,值为 6,数组的其他元素没
17、有变化,所以答案选 A。 【知识模块】 指针 25 【正确答案】 A 【试题解析】 函数 fun()的功能求得二维数组 s中第 k列前 n行的最大值并保存在 m中,所以输出 fun(a,4,0)的结果为 31,答案选 A。 【知识模块】 指针 26 【正确答案】 A 【试题解析】 计算字符常量时一般使用其 ASCII码进行运算。 a+1=b, fun()中的第一个参数为地址传参,形参的变化会影响实参的变化,所 以两次输出的 b值都为字符 b;第二个参数为值传参,形参变化不会影响实参,所以在函数 fun()体内输出字符 B,函数 fun()体外输出结果为字符 A,所以答案选 A。 【知识模块】
18、指针 27 【正确答案】 A 【试题解析】 要实现 “每行 8个输出 w所指数组中的数据 “,即每行输出 8个数据,即每输出 8个数据换行,所以输入的语句要判定输出的数据个数是否为 8的倍数,若是则输出一个 n。用 C语言表述即是选项 A)。 【知识模块】 指针 28 【正确答案】 A 【试题解析】 函数 fun()的功能是将字符指针 c指向的字符串中所有小写字符转换成对应的大写字符,所以答案选 A。 【知识模块】 指针 29 【正确答案】 A 【试题解析】 (*pf)(int, char*)中 pf为函数指针变量,可以指向任何已经定义的合法的函数, *pf()为指针型函数,返回值为指针型数据
19、,不能指向任意函数,所以答案选 A。 【知识模块】 指针 30 【正确答案】 A 【试题解析】 函数 fun()的功能是将数组 s中下标为 n1和 n2之间的数据逆序,所以调用语句 fun( a,0,3 ); fun( a,4,9 ); fun( a,0,9 );结束后,是先将数组 p中下标为0至 3之间的元素逆序,然后将下标为 4至 9之间的元素逆序,再将整个数组逆序,答案选 A。 【知识模块】 指针 31 【正确答案】 A 【试题解析】 指针 p指向变量 c的地址,所以 *p与 c等价, *p的改变也会影响到变量 c的值。语句 “*p =*p1*(*p2);“取值运算符 “*“要高于乘法运
20、算符 “*“,计算得 *p=1*3=3,所以输出的 c值为 3,答案选 A。 【知识模块】 指针 32 【正确答案】 A 【试 题解析】 函数的参数传递过程中,参数的传递是单向的,形参只是实参的一个副本,形参改变不能影响到实参。如果形参和实参为两个地址,形参指针指向变量的变化能够影响到实参指针指向变量的变化,这是因为形参指针和实参指针指向了同一个地址空间。但是形参指针指向的变化不能影响到实参指针的指向。所以该函数 f()调用中,第一个参数只是改变了形参 p的指向,第二个参数改变了指针变量 q指向的变量的值,所以函数调用结束后, m值不变, n值自增 1,答案选 A。 【知识模块】 指针 33
21、【正确答案】 A 【试题解析】 指针数 组 *p3表示每个数组元素都能存放一个基类型为 int的指针或者 int型变量的地址,不能存放二级指针,二维数组名 a为一个二级指针, &a则相当于三级指针,选项 B)、 D)错误; p为指针数组名,不能进行赋值运算,选项 C)错误;所以答案选 A)。 【知识模块】 指针 34 【正确答案】 A 【试题解析】 (*f)(int)中 f为函数指针变量,可以指向任何已经定义的合法的函数,该函数带有一个 int类型的形参,所以答案选 A。 【知识模块】 指针 35 【正确答案】 A 【试题解析】 函数的 参数传递过程中,参数的传递是单向的,形参只是实参的一个副本,如果形参和实参为两个地址,形参指针指向的变化不能影响到实参指针的指向。所以该函数 fun()调用结束后并不能改变指针变量 p、 q的指向,所以输出结果均为 3、 5,答案选 A。 【知识模块】 指针