国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷1
选择题
1.有以下程序:
#include
void f(int*P,int*q);
main()
{
int m=1,n=2,*r=&m:
f(r,&n);
printf(“%d,%d”,m,n);
}
void f(int*p,int*q)
}
P=P+1:
*q=*q+1:
}
程序的运行结果是( )。(B)
A. 2,3
B. 1,3
C. l,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
main()
{
int a=1,b=3,c=5;
int*pl=&a,*p2=&b,*P=&c;
*p=*p1*(*p2);
printf(“%d\n”,c);
}
程序的运行结果是( )。(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
main()
{
int n,*p=NULL;
*p=&n:
printf(“Input 13:”);
ScaRf(“%d”,&p);
prinff(“output n:”);
printf(“%d\11”,P);
}
该程序试图通过指针P为变量n读入数据并输出,但程序有多处错误,下列语句中正确的是( )。(A)
A. int n,*p=NULL;
B. *P=&n;
C. scallf(“%d”,&p)
D. printf(“%d\n”,P);
解析:B选项的正确写法应为p=&n;C选项的正确写法应为scanf(“%d’t,p);选项D的正确写法应为printf(“%d\n”,*p)。
6.若有定义语句double x,y,*px,*py;,执行了px:&x;py=&y;之后,正确的输入语句是( )。(A)
A. scanf(“%If%le”,px,py);
B. scanf(“%f%f”&x,&y);
C. scallf(“%f%”,x,y);
D. s(2anf(“%If%If”,x,y);
解析:因为x和y都是double型数据,所以输入时的格式字符应为%If,所以B、C选项错误。D选项中的scanf(“%lf%lf”,x,y);应为scanf(”%lf%lf..,&x,&y);。
7.下列程序段中完全正确的是( )。(C)
A. int*p;scanf(“%d”,&p);
B. int*p;seailf(“%d”,P);
C. int k,*p=&k;searlf(“%d”,P);
D. int k,*p;*p=&k;seanf(“%d”,P);
解析:A选项中错在没有对指针进行初始化,无效指针,并且在scanf(“%d,&p)中无须再进行取地址操作;B选项中没有对指针进行初始化,无效指针;D选项中语句*p=&k;的左端*p是指针所指内存空间的值,&k是地址,应为p=&k。C选项正确。
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
9.有以下程序:
#include
void fun(char*c,intd)
{
*c=*c+1:
d=d+1:
prinff(“%c,%c,”,*c,d);
}
main()
{
char b=’a’,a=’A’;
fun(&b,a);
printf(“%c,%c\n”,b,a);
}
程序的运行结果是( )。(A)
A. b,B,b,A
B. b,B,B,A
C. a,B,B,a
D. a,B,a,B
解析:本题重点考查函数的调用。首先要了解字母对应的ASCII码,例如A为65,a为97,字母+1可得到下一个字母。其次是函数形参和实参的问题,运行过程如下:在fun(&b,a)中,*e=‘a’,d=65。*c+1=’b’,d+1=66,prinff(“%c,%c,”,*c,d);输出b,B;因为指针c指向地址的值为b,此时b=*c=’b’;函数返回执行prinff(“%c,%c\n”,b,a);输出b,A,因此A选项正确。
10.以下函数实现按每行8个输出W所指数组中的数据:
#include
void fun(int*w,int n)
{
本文档预览:3600字符,共10515字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载