国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷3
选择题
1.有以下程序:
#include<stdio.h>
void]]f(int*p,int*q);
main( )
{
int m=1,n=2,*r=&m;
f(r,&n);
prinff(\\(B)
A. 2,3
B. 1,3
C. 1,4
D. 1,2
解析:在f(int*p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向n的地址所对应的值加1,所以m的值所对应的值没有变,而n的值则为3了,因此B选项正确。
2.设已有定义float x;,则下列对指针变量p进行定义且赋初值的语句中正确的是( )。(B)
A. int*p=(float)x;
B. float*p=&x;
C. float p=&x;
D. float*p=1024;
解析:指针是用来存放地址的变量,用(类型名*指针变量名)的形式定义。赋值时应将某个变量地址即&x赋给指针变量,所以选择B。
3.若有定义语句double a,*P=&a;,下列叙述中错误的是( )。(A)
A. 定义语句中的*号是一个间址运算符
B. 定义语句中的*号是一个说明符
C. 定义语句中的p只能存放double类型变量的地址
D. 定义语句中,*p=&a把变量a的地址作为初值赋给指针变量p
解析:在变量定义double a,*p=&a;中,*号是一个指针运算符,而非间址运算符,所以A错误。
4.有以下程序:
#include<stdio.h>
main( )
{
int a=1,b=3,c=5;
int*p1=&a,*p2=&b,*p=&c;
*p=*p1*(*p2);
printf(\\(C)
A. 1
B. 2
C. 3
D. 4
解析:该程序中int*p1=&a,*p2=&b,*p=&c;指定义3个指针变量,并赋值,即使p1指向a;p2指向b;p指向c。*p=*p1*(*p2);语句是给p所指的存储单元c赋值,就是p1所指的存储单元的值,即a的值,与p2所指的存储单元b的值相乘,也就是c=a*b,等价于c=1*3=3,因此C选项正确。
5.有以下程序:
#include<stdio.h>
main( )
{
int n,*p=NULL;
*p=&n:
prinff(\\(A)
A. int n,*p=NULL;
B. *p=&n;
C. scanf(\\
D. prinff(\\
解析:B选项的正确写法应为p=&n;C选项的正确写法应为scanf(\\
6.若有定义语句double x,y,*px,*py;,执行了px=&x;py=&y;之后,正确的输入语句是( )。(A)
A. searlf(\\
B. seanf(\\
C. scard\\
D. seanf(\\
解析:因为x和y都是double型数据,所以输入时的格式字符应为%lf,所以B、C选项错误。D选项中的scanf(\\
7.下列程序段中完全正确的是( )。(C)
A. int*p;scanf(\\
B. int*p;scanf(\\
C. int k,*p=&k;scanf(\\
D. int k,*p;*p=&k;scanf(\\
解析:A选项中错在没有对指针进行初始化,无效指针,并且在scanf(\\
8.若有定义语句int a[2][3],*p[3];,则以下语句中正确的是( )。(C)
A. p=a;
B. p[0]=a;
C. p[0]=&a[1][2];
D. p[1]=&a;
解析:A选项错误,因为p是指向一个指针数组,作为数组名,不能指向别的地方。B选项错误,因为p[0]是一个int指针,也就是int*;而a是一个指向指针的指针int**。C选项正确,因为p[0]是一个int*,a[1][2]是int,&a[1][2]是int*,类型吻合。D选项错误,因为a作为数组名,不能取地址,即使能取,p[1]是int*,&a是int***,类型不对。
9.设有以下函数:void fun(int n,char*s){…},则下列对函数指针的定义和赋值均正确的是( )。(D)
A. void(*pf)(int,char);pf=&fun;
B. void*pf( );pf=fun;
C. void*pf( );*pf=fun;
D. void(*pf)(int,char*);pf=fun;
解析:函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。函数名代表函数的入口地址,指向函数的指针应该定义为void(*pf)( )。如果定义为void*pf( ),则表示函数pf的返回值是一个基类型为void的指针,因此D选项正确。
10.)下列函数的功能是( )。
void fun(char*a,char*b)
{while((*b=*a)!=’\0’){a++;b++;}
}(A)
A. 将a所指字符串赋给b所指空间
B. 使指针b指向a所指字符串
C. 将a所指字符串和b所指字符串进行比较
D. 检查a和b所指字符串中是否有’\0’
解析:while循环条件为:(*b=*a)!=’’0],执行时先把指针a所指向的字符赋给指针h所在的内存单元,如果该字符不是结束标识“\0”,执行循环体“a++;b++;”,指针a、b分别指向下一个字符单元。再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在的内存单元,直到遇到结束标识为止,因此A选项正确。
11.有以下程序:
#include<stdio.h>
#define N4
void fun(int a[][N],int b[])
{int i;
for(i=0;i<N;i++)b[i]=a[i][i]-a[i][N-1-i];
}
main( )
{int x[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},y[N],i;
fun(x,y);
for(i=0;i<N;i++)
prinff(\\(A)
A. -3,-1,1,3,
B. -12,-3,0,0,
C. 0,1,2,3,
D. -3,-3,-3,-3,
解析:本题由fun函数可知,b[0]=a[0][0]-a[0][3]=1-4=-3,b[1]=a[1][1]-[1][2]=6-7=-1,b[2]=a[2][2]-[2][1]=11-10=1,b[3]=a[3][3]-[3][1]=16-13=3,所以主函数中打印y
本文档预览:3600字符,共8005字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载