国家二级C语言(编译预处理和指针)机试模拟试卷12
选择题
1.有以下程序
#include <stdio.h>
void fun(int *a,int *b)
{ int *c;
c=a;a=b;b=c;
}
main()
{ int x=3,y=5,*p=&x,*q=&y;
fun(p,q);printf(\\(B)
A. 3,5,5,3
B. 3,5,3,5
C. 5,3,3,5
D. 5,3,5,3
解析:本题考查函数的调用与指针。p和q分别为指向x和y的指针,函数fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。而主函数中,fun(p,q)、fun(&x,&y)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。
2.有下列程序:
void f(int b[ ])
{ int I;
for(i=2;i<6;i+ +) b[i]*=2;
}
main( )
{ int a[10]={1,2,3,4,5,6,7,8,9,10},i;
f(a);
for(i=0;i<10,i+ +)printf(\\(C)
A. 1,2,3,4,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,
解析:函数void f(int b[ ])的功能是对数组b[ ]中第2个到第5个元素的值逐个扩大2倍。所以在main()函数中,f(a)语句的作用是对数组a[10]中从a[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。
3.有以下程序
#include <stdio.h>
int fun(char s[ ])
{ int n=0;
while(*s<=’9’&&*s>=’0’) {n=10*n+*s-’0’;s+ +;}
return(n);
}
main( )
{ char s[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’};
printf(\\(B)
A. 61490
B. 61
C. 9
D. 5
解析:在fun函数中,while循环的功能是逐个取字符数组s的字符判断其是否是数字。若是则将这些数字组成一个数保存到变量n中,并返回变量n的值。所以在主函数中调用fun(s)时,将把字符数组s中的数字组成一个数输出。因为当指针s指向数组的第3位时,即字符’*’,循环条件不成立,循环结束,返回n的值。所以输出n的值为61。
4.若有以下程序
#include <stdio.h>
void sp(int *a) {
int b=2;
a=&b;
*a = *a * 2;
printf(\\(B)
A. 4,3,4
B. 4,3,3
C. 6,3,6
D. 6,6,6
解析:主函数中定义指针变量p指向k,调用函数sp(p),将k的地址传递给形参指针a,函数转到sp运行,a指向b的地址,表达式*a = *a * 2,相当于b=b*2,得到*a的数据4输出。函数调用结束,此时a和b的空间撤销,而对实参k和p的值并没有改变,仍旧是3。
5.若有以下程序
#include <stdio.h>
int k=7;
void f(int **s) {
int *t=&k;
*s=t;
printf(\\(D)
A. 3,7,7,7,7,7
B. 7,7,7,3,3,3
C. 3,3,3,7,7,7
D. 7,7,7,3,7,7
解析:本题考查了二级指针,二级指针可以保存一级指针的地址。主函数中p指向i,r指向p,函数调用后s指向p,在f函数中t指向全局变量k=7,s指向t,同时s保存了实参p的地址,此时p也指向t,输出三个7,流程转到主函数,i的值为3,p以及r的值为7。
6.若有以下程序
#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);
printf(\\(D)
A. 3,5,5,3,5
B. 5,3,5,3,5
C. 5,3,3,5,5
D. 3,5,3,5,5
解析:本题考查了返回值为指针的函数,函数f的主要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中p指向i,q指向j,调用r=f(p,q),返回q的地址,因此*p=3,*q=5,*r=5。
7.若有以下程序
#include<stdio.h>
void sp(int *a) {
int b=2;
*a = *a * 2;
printf(\\(A)
A. 6,4,6
B. 6,4,3
C. 6,12,12
D. 9,4,9
解析:本题考查了指针作为函数的参数,可以接收实参变量的地址,改变实参的值。主函数调用sp(&k),执行sp函数a指向向k,执行语句*a = *a * 2后a指向空间的值k的值为6,改变a的指向以后,此时a指向b,则执行*a = *a * 2以后,a指向空间b的值为4。调用结束返回主函数,输出k的值为6。
8.若有以下程序
#include <stdio.h>
int k=7,m=5;
void f(int **s) {
int *t=&k;
s=&t; *s=&m;
printf(\\(C)
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,
解析:本题考查二级指针作为函数的参数,可以通过函数调用来改变主函数中一级指针的指向。主函数中指针变量p指向i,r指向p,调用f函数,形参指针s指向p,流程转到f函数执行,指针变量t指向k,s指向t,此时更改了s的指向,s指向了t,更改了s指向的地址空间内容为m的地址,同时t也指向变量m,因此**s的值为m的值,*t为m的值,k为7。流程返回到主函数,没有对主函数空间的数据和指向作出更改,因此全部为3。
9.若有以下程序
#include <stdio.h>
int *f(int *s, int *t) {
int k;
if (*s
本文档预览:3600字符,共10805字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载