二、填空题
1.简述传值: 。 2.形参其实就是变量,实参是表达式,可以是 、 、 、 ,。形参和实参结合,必须满足三个条件: 、 和 。
3.空函数是指 。
4. 函数是由系统调用的。 5.定义函数时函数名后面括号中的参数为 ,函数调用时函数名后面括号内的参数是 。
6.函数可以嵌套调用,但是不能嵌套 。
7.程序的执行总是从 函数开始,最后由 函数中结束。 8.一个C程序由 个源程序文件组成。
9.若没有定义函数的类型,该函数的类型是 ,如果在函数中没有使用return语句,则返回的是 值。
10.如果函数值的类型为 ,表示函数没有返回值。
第6章 编译预处理
一、选择题
1.下列程序执行后的输出结果是( )。 #define MA(x) x * ( x - 1 ) void main(void) {int a = 1 , b = 2;
printf(\}
A.6 B.8 C.10 D.12 2.以下程序中,for循环体执行的次数是( )。 #define N 2
#define M 1+ N #define K M+1*M/2 void main(void) {int i;
for( i = 1;i < K; i++) {??} ?? }
A.4 B.5 C.3 D.6 3.下列程序执行后的输出结果是( )。 #define F(x) x*x main() {int i;
i=F(4+4)/F(2+2); printf(\}
26
A.4 B.16 C.28 D.24 4.宏展开是在( )阶段完成的。 A.程序运行时 B.编辑程序时 C.编译阶段 D.编译之前 5.以下程序运行的结果是( )。 main()
{#ifdef YES
printf(\ #else
printf(\ #endif }
A.编译出错 B.Hello C C.Bye bye! D.Hello C Bye bye! 6.以下文件包含命令中错误的是( )。 A.#include
printf(\}
A.19 B.12 C.18 D.15 8.以下叙述中正确的是( )。 A.预处理命令行必须位于源文件的开头 B.在源文件的一行上可以有多条预处理命令 C.宏名必须用大写字母表示
D.宏替换不占用程序的运行时间 9.以下程序输出结果为( )。 #define S (x) x+x void main(void) {int a; a=S(2*2); printf(\}
A.2 B.16 C.8 D.报错 10.以下说法错误的是( )。
A.预处理命令是在编译之前完成的工作 B.文件包含命令可以用来处理多文件程序 C.#if后边必须是常量表达式
27
D.#define STU NO 10,是定义一个宏名为STU NO,宏体为10的宏定义 二、填空题
1.在预处理宏定义时,不做 检查,只有在编译已被宏展开后的源程序时才报错。
2.宏名的作用域是从宏定义开始到本文件结束或者到 命令的位置结束。 3.宏展开时,只是将宏名用 做简单替换,而并不关心语法。 4.预处理命令都是以 符号做为命令的开头。
5. 一般情况下,源程序中所有的行都参加编译。如果希望对其中一部分内容只在满足一定条件时才进行编译,这就是 。
第7章 指针
一、选择题
1.指针是一种( )。 A.标识符 B.变量 C.内存地址 D.运算符 2.显示指针变量p中的值,可以使用以下哪个命令( )。 A.printf(\ B.printf(\ C.printf(\ D.printf(\3.为指针变量p输入整型变量i的地址,以下正确的是( )。 A.scanf(\ B.*p=i; C.p=&i; D.*p=&i; 4.若有定义int *p,*q,i;下面操作不正确的是( )。 A.p=*q+i; B.*p=--i; C.i=p-q; D.p=--q+i;
5.若有定义int a[]={0,1,2,3,4},i=2,*p=a;以下能正确表示数组元素的是( )。 A.p+i B.p[5] C.a+i D.*(a+i) 6.以下不能进行++和--运算的是( )。 A.指针 B.数组名 C.int D.long
7.若有定义int *p;float *q;以下强制类型转换不正确的是( )。 A.p=(int *)q; B.q=(float *)p; C.p=(int)*q; D.*q=(float)*p; 8.若有定义int a[]={1,2,0};那么a[a[a[0]]]的值是( )。 A.0 B.1 C.2 D.3 9.若有说明 #define M 20 int n=10;
下面定义不正确的是( )。 A.float s[M]; B.float s[M*10]; C.float s[M+n]; D.float s[M+10];
10.若有定义int a[3][2]={1,2,3,4,5,6};下面能正确访问元素4的是( )。 A.a[2][2] B.*(a+3)
28
C.*(*a+3) D.*(a[2]+1) 11.若有定义char s[10],*p=s;那么下面表达式正确是( )。 A.s=p+s; B.p=s+10; C.s[2]=p[4]; D.p=s[0]; 12.若有定义int (*p)[m];则p是( )。 A.m个元素的整型数组 B.指向m个元素的整型数组的指针 C.m个整型指针的数组 D.指向m个整型指针数组的指针 13.定义整型指针变量p和q,下面正确的命令是( )。 A.int *p,q=NULL; B.int *p,q=NULL, NULL; C.int *p, *q=NULL, NULL; D.int *p, *q=NULL; 14.若有定义int *p,i,j;下面操作不正确的是( )。 A.p=&i+j; B.*p=i+j; C.p=&i; D.p=&i++; 15.下面定义不正确的是( )。 A.float s[2][]={1}; B.float s[][2]={1}; C.float s[2][2]={1}; D.float s[2][2]={{1},{1}}; 16.若有定义int a[]={1,2,3},b[3]={1,2,3};则表达式a==b的结果是( )。 A.不能比较 B.结果为真 C.结果为假 D.结果不确定
17.若有定义int a[][3]={1,2,3,4,5,6};下面能正确访问元素5的是( )。 A.a[4] B.a[0]+4 C.**a+4 D.*(&a[0][0]+4)
18.若有定义int x[5][6],*p=x;下面不表示数组元素x[0][2]的是( )。 A.p[0][2] B.*x+2 C.*(*x+2) D.x[0][2] 二、填空题
1.数组是类型相同的数据序列,通过 来指定要访问的元素。 2.二级指针是存放一级指针的 。
3.空指针名称是 ,表示没有指针的一种状态。 4.函数名和 名可以作为指针常量。 5.数组下标可以是非负的 。
6.二维数组作为函数参数, 维必须给出大小。
7.如果子程序要修改主程序的变量,可以使用 类型的参数。 8.初始化指针变量的工作可有可无,若无则变量值是 。 9.不同类型的指针变量的赋值必须 。
10.二维数组有两个 ,分别用一对 括起。 11.函数指针是函数的 ,通过它可以访问该函数。
12.void是空类型,表示没有数据的类型,void *表示 。 13.数组指针是指 。
14.函数的返回值和 可以是指针。
15.数组作为函数返回类型,实际上不是返回数组值,而是返回 。 16.数组的下标必须在定义的空间之内,若超界C语言编译器 。 17.二维数组名是 的指针常量。
18.整型与实型类型是兼容的,整型和实型指针类型 。
29
三、程序分析题
1.阅读程序,写出运行结果。 #include
{ static int arr[]={4,5,6}; int j; for(j=0;j<3;j++)
{ printf(\ } }
2.阅读程序,写出运行结果。 #include
{ static int arr[]={4,5,6}; int j, *ptr=arr; for(j=0;j<3;j++)
{ printf(\ } }
四、程序填空题
1.函数fun(int a[],int n,inty)的功能是替换数组a中值为y的元素,n为数组长度。例如,假设数组a中的元素为:1 2 4 1 1 3 1 5,y为8,则替换后,数组a中的元素为8 2 4 8 8 3 8 5。请填空,完成题目要求。
fun(int a[],int n,int y) { int i;
for(i=0;i (1) ;i++) if(a[i]==y) (2) ; }
2.函数fun()的功能是把字符数组a中的字符串按反序存放,例如,字符串“abcd”的输出结果为“dcba”。
#include
for(i=0,j=strlen(a)-1;i a[i]=a[j]; a[j]=t; } } main() { char s[10]; printf(\ scanf(\ 30