习 题 一
一、选择题
1.C程序的基本单位是( A)。 A.函数 B.文件 C.语句 D.字符 2.C程序中的变量(B )。 A.不用说明 B.先说明后引用 C.先引用后说明 D.引用和说明顺序无关 3.变量的说明在(B )。 A.执行语句之后 B.执行语句之前 C.执行语句当中 D.位置无关 4.C语言是一种( C)。 A.机器语言 B.符号语言 C.高级语言 D.面向对象的语言
二、填空题
1.一个C程序总是从 主函数 开始执行。 2.结构化程序由 顺序 、 选择 、 循环 三种基本结构构成。 3.一个C程序只有一个名为 main 的主函数。 4.C程序中的每个语句以 分号 结束。 5.C程序中,函数由 函数首部 和 函数体 组成。 6.每个基本结构有 一个 入口和 一个 出口,没有 死循环 和 死语句 。 7.算法是 计算机解决问题所依据的步骤。 习 题 二
一、选择题
1.下列数据中属于字符串常量的是( B)。 A.ABC B.\ C.'abc' D.'A' 2.在计算机内存中,'\\n'占用的字节数是( C)。 A.4 B.3 C.1 D.2 3.字符串\在内存中占用的字节数是( D)。 A.6 B.8 C.3 D.4 4.在C语言中,合法的长整型常数是 ( B)。 A. B.0L C.0. D.2.654e11 5.char型常量在内存中存放的是( A)。 A.ASCII代码值 B.BCD代码值 C.十进制代码值 D.内码值 6.下列各项中正确的标识符是( D)。 A.?bb B.a=8 C. b.β D.b_4 7.下列不正确的转义字符是( D)。 A.\\\\ B.\\ 0 C.\\\ D.0x4 8.设整型变量a、b的值均为5,则表达式(m=n=a++)/(n=b-2)的值为( B)。 A.0 B.1 C.2 D.3 9.设a的值为5,执行下列语句后,b的值不为2的是( C)。 A.b=a/2 B.b=6-(--a) C.b=a%2 D.b=(float)a/2 10.执行语句x=(a=3,b=a--)后,x、a、b的值依次是( C)。 A.3,3,2 B.3,2,2 C.3,2,3 D.2,3,2 11.设有语句int a=3;,则执行了语句a+=a-=a*a;后,变量a的值是( D)。 A.3 B.0 C.9 D.-12 12.在下列运算符中,优先级最高的是( B)。 A.&& B.% C.= D.>= 13.设整型变量a的值为3,则计算表达式a---a后,表达式的值为(B)。 A.1 B.0 C.2 D.表达式出错 14.设整型变量a、b、c的值均为2,表达式a---b+++c++的结果是( C)。 A.6 B.9 C.2 D.表达式出错 15.若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是( D)。 A.1 B.2.5 C.2 D.2.0 16.下列表达式中符合C语言语法的赋值表达式是( C)。 A.a=4+b++c=a+8 B.a=4+b++=a+8 C.a=(4+b,b++,a+8) D.a=4+b,c=a+8 17.若有以下定义:char a;int b;float c;double d;,则表达式a*b+d-c的值的类型为( D)。 A.int B.float C.char D.double 二、填空题
1.在内存中存储\要占 2 个字节,存储'A'要占 1 个字节。 2.符号常量的定义方法是 #define 常量名 常量 。 3.无符号基本整型的数据类型符为 unsigned int双精度实型数据类型符为 double ,字符型数据类型符为 char 。 4.十进制数673的二进制、八进制和十六进值数分别为 、 printf(\}
结果:6,5,6,5
习 题 三
2412 和 2A1 。 5.在C语言中,书写八进制数时必须加前缀 0 ;书写十六进制数时必须加前缀 0x 。 6.在微机上,int型、short型、long型、float型和double型数据一般在内存中分别占 2 字节、 2 字节、 4 字节、 4 字节和 8 字节。 7.设有下列运算符:<<、+、++、&&、>=,其中优先级最高的是 ++ ,优先级最低的是 && 。 8.设x、y为int型变量,且x=1,y=2,则表达式1.0+x/y的值为 1.0 。 9.设整型变量x、y、z均为5,则: ① 执行x-=y-z后,x的值为 5 。 ② 执行x%=y+z后,x的值为 5 。 10.数学式ab×c 的C语言表达式为 a/b*c) 。 三、简答题
1.字符常量与字符串常量有什么区别? 2.对于Turbo C系统来说,char型变量与int型变量在内存中存储数据的区别是什么? 3.整型变量可细分为哪六类? 4.什么是一个实型数据的规范化指数形式? 5.设x=3.5,a=5,y=6.7,求算术表达式x+a%3*(int)(x+y)%2/4的值。 6.设a=2,b=3,x=4.5,y=1.6,求表达式(float)(a+b)/2+(int)x%inty的值。 7.设整型变量a=12,写出下列表达式运算后a的值。 ① a*=2+5 ② a/=a+a ③ a+=a-=a*=a 8.写出下列程序的运行结果。 main() { char c1='A',c2='B',c3='C',c4='\\101',c5='\\h42';
printf(\%c\\tbc\\n\);
printf(\}
结果:AAbB C abc AB
9.写出下面程序的运行结果。 main()
{ int i,j,m,n; i=5; j=6; m=++i; n=--j;
一、选择题
1.printf()函数输出实数时,使用的格式字符是(C)。 A.%d B.%c C.%f D.%o 2.下面变量说明中(C)是正确的。 A.char:a ,b ,c; B.char a;b;c; C.char a , b , c; D.char a,b ,c 3.putchar()函数可以向终端输出一个(D )。 A.整型变量表达式值 B.实型变量值 C.字符串 D.字符或字符型变量值 4.阅读以下程序,当输入数据的形式为:25,13,10〈CR〉,正确的输出结果为( D )。 main()
{ int x,y,z;
scanf(\printf(\} A.x+y+z=48 B.x+y+z=35 C.x+z=35 D.不确定值 5.以下说法正确的是( D )。 A. 输入项可以是一个实型常量 B. 只有格式控制,没有输入项,也能进行正确输入,如scanf(\C. 当输入一个实型数据时,格式控制部分应规定小数点后的位数,如scanf(\D. 当输入数据时,必须指明变量的地址,如scanf(\6.以下能正确地定义整型变量a、b和c并为其赋初值5的语句是(C )。 A.int a=b=c=5; B.int a,b,c=5; C.int a=5,b=5,c=5; D.a=b=c=5; 7.已知ch是字符型变量,下面正确的赋值语句是(B )。 A.ch='a+b'; B.ch='\\xff'; C.ch='\\08'; D.ch=\8.设x、y均为float型变量,则以下不合法的赋值语句是( B )。 A.++x; B.y=(x%2)/10; C.x*=y+8; D.x=y=0; 9.以下格式符中,不能用来输入实型数的是( B ) A.f B.e(E) C.g(G) D.x 正确的是( B ) A.123. B. 123.4560 C.123.4560 (n-c>d)后n的值为( B )。 A.1 D.4 B.2 C.10. 若float num=123.456,以%+10.4d的格式输出,结果3 D.+123.4560 二、填空题 1.以下程序的输出结果是 x=1 y=2 *sum*=3 10 squaredis :100 。 main()
{ int x=1,y=2; printf(\y=%d *sum*=%d\\n\printf(\squared 3.若k是int型变量,且有下面的程序段,输出结果是( A )。 K=-3;
if(k<=0) printf(\else printf(\A.#### B.&&&& C.####&&&& 无输出结果 4.设A、B和C都是int型变量,且A=3,B=4,C=5,则下面表达式中值为0的达式是( D )。 A.A&&B B.A<=B D.有语法错误,is :%d\\n\}
2.以下程序的输出结果是 a=325 x= 3.14 。 main()
{ int a=325;double x=3.;
printf(\}
3.假设变量a和b均为整型,以下语句可以不借助任何变量把a、b中的值进行交换。请填空:a+=b ; b=a-b ;a-=b ; 4.若x为int型变量,则执行以下语句后x的值是-14 。 x=7;
x+=x-=x+x;
5.C语句可以分为五类,含 7 种控制语句、 声明语句、 表达式 语句、空语句和复合语句。 6.赋值语句是由 赋值表达式 加上一个分号构成。 7.a=12,n=5,表达式a%=(n%=2)值是 0 。 8.有一个输入函数scanf(\则不能使float类型变量k得到正确数值的原因是 k前无& 和 %d与k的类型不一致 。 9.putchar()函数可以向终端输出一个 字符 。 10.已有定义int i,j;float x;为将-10赋给 i,12赋给j,410.34赋给x,则对应以下scanf()函数调用语句的数据输入形式是 -12 C 410.34 。 scanf(\&i,&j,&x); 11.pirntf()函数中用到格式符%5s,其中数字5表示输出的字符串占5列,如果字符串长度大于5,则 按实际宽度输出 。 12.使用getchar()和putchar()函数必须在源程序中加 #include\。
习 题 四
一、选择题
1.执行下面的程序段后,b的值为( B )。 int x=35; char z='A'; int b;
b=((x&&15)&&(z<'a')); A.0 B.1 C.2 D.3 2.设a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a>b)&&C.A‖B+C&&B D.!((A
scanf(\%f\if(x<0.0) y=0.0;
else if((x<5.0)&&(x!=2.0))
y=1.0/(x+2.0); else if(x<10.0) y=1.0/x;
else y=10.0; printf(\%f\\n\} 若运行时从键盘上输入2.0,则上面程序的输出结果是( C ) A.0. B.0. C.0. D.1. 6.阅读程序: #include\main()
{ int x=1,y=0,a=0,b=0;
switch(x) { case 1:
switch(y)
{ case 0:a++;break;
case 1:b++;break; }
case 2:
a++;b++;break; }
printf(\%d,b=%d\n\; }
上面程序输出结果是( A )。 A.a=2,b=l B.a=l,b=l C.a=l,b=0 D.a=2,b=2 7.下面程序的输出是(C )。 main( )
{ int a=–1,b=4,k;
k=(a++<=0)&&(!(b--<=0));
printf(\%d%d%d%\n\
A.0 0 3 B.0 1 2 C.1 0 3 D.1 1 2 8.为表示关系x≥y≥z,应使用C语言表达式( A )。 A.(x>=y)&&(y>=z) B.(x>=y)AND(y>=z) C.(x>=y>=z) D.(x>=y)&(y>=z) 能正确表示这一关系的表达式为( D )。 A.a<>0 B.!a 1.设ch是char型变量,其值为A,且有下面的表达式: ch=(ch>'A'&&ch<='Z')? (ch+32):ch 该表达式的值是 A 。 2.若已知a=10,b=20,则表达式“!a
%
d\\n\
的值为 9.若要求在if后一对圆括号中表示a不等于0的关系,则C.a=0 d,C=
D.a 10.若有以下定义: float x; int a,b; 则正确的switch语句是(D )。 A.switch(x) {case 1.0:printf(\; case2.0:printf(\;}
B.switch(x) {case 1,2:printf(\\n\; case 3:printf(\\n\;}
C.switch(a+B) {case 1:printf(\;
case 1+2:printf(\\n\;}
D.switch(a+b); {case 1:printf(\\n\; case 2:printf(\\n\;}
11.下列语句中,错误的是(C )。 A.while(a=b)a++; B.while(0); C.do D.do {
printf(“ok\\n”); {x++;
}
while(x==5) }while(--x==0); 12. 执行语句:for(i=1;i++<4; )后变量i的值为:( B )。A.3 B.4 C.5 D.6 13. 以下程序的输出结果是:( D )。 main()
{ int x=10,y=10,i;
for(i=0;x>8;y=++i)
printf(\
}
A.10 1 9 2 B.9 8 7 6 C.10 9 9 0 D.10 10 9 1 14. 以下for语句的循环次数为:( B )。 int i=0,j=0; for(;!j&&i<=5;i++)j++; A.5次 B.1次 C.6次 D.无限多次 15. 以下程序段中内嵌循环共被执行的次数为:( A ) for(i=5;i;i--) for(j=0;j<4;j++)
{…}
A.20 B.24 C.25 D.30 二、填空题
###a=10,b=19,c=30 。 4.下面程序的输出结果是 0,0,4 。 main()
{ int a=-1,b=4,k; k=(++a<0)&&!(b-->=0);
printf(\%d%d%d\\n\}
5.假定所有变量均已正确说明,下列程序段运行后,x的值是 4 。 a=b=c=0; x=35; if(!a) x--;
else if(b); if(c) x=3; else x=4;
6.若执行下面的程序时,从键盘上输入3和4,则输出结果是 3 。 main( )
{ int a,b,s;
scanf(\%d%d\
s=a;
if(a&&b) printf(\%d\n\else printf(\%d\n\} 7.以下程序的输出结果是 x=11,i=11 。 main()
{ int x=1,i=1; for(;x<50;i++) {if(x>=10)
break; if(x%2!=1)
{x+=3; continue; } x-=1; } printf(\}
8.以下程序的输出结果是 i=9,j=10 。 main()
{ int i=10,j=0; do {j=j+i;
i--; }while(i>j);
printf(\
} 9.以下程序的输出结果是 35 。 main()
{int m=7,n=5,i=1;
do
{if(i%m==0) if(i%n==0)
{printf(“%d\\n”,i);break;} i++;
}while(i!=0); }
10.以下程序的输出结果是 1,-2 。 main()
{ int x=3; do
{printf(\}while(!(--x)); }
11.以下程序的输出结果是 i=4,j=6 。 main()
{ int i,j;
B.int a[][3]={2,3,4,5,6,7}; C.int a[3][3]={0}; D.int a[5][4]={{1,2},{2,3},{3,4},{4,5}}; 6.若有以下数组定义: char ch[]=\则数组ch的存储长度是(D )。 A.7 D.10 B.8 C.9 7.以下程序段的输出结果是( A ). char
str[8]={'a','b','c','d','\\0','y','z','\\0'};
printf(\A.abcd B.abcd yz C.abcdyz for(i=0;i<5;i++)
{for(j=1;j<10;j++) if(j==6) break; if(i<3)
continue;
if(i>3)
break; }
printf(\}
习 题 五
一、选择题
1.下列为一维数组初始化时, 正确的是( D ). A.int a[ ]={1,3,5,7,9,…,15}; B.int a[5]={ }; C.int a[5]={5*3}; D.int a[5]={0}; 2.下列一维数组说明中,正确的是( A ). A.#define M 10 B.int m; float s[M]; scanf(“%d”,&m); float a[m]; C.int m=10, a[m]; D.int a[ ]; 3.若要将2,4,6,8存入数组a中,不正确的是( C ). A.int a[4]={2,4,6,8}; B.int a[ ]={2,4,6,8}; C.int a[4]; a={2,4,6,8}; D.int a[4]; a[0]=2;a[1]=4,a[2]=6;a[3]=8; 4.若有说明: int a[5][5]; 则对数组元素的正确引用是 C ). A.a[3+2][3] B.a[0,3] C.a[4][1+2] D.a[ ][2] 5.下列二维数组初始化中,错误的是( A ). A.int a[2][ ]={{3,4},{5}}; D.出错 8.设有如下定义: char s1[20]=\s2[10]=\
执行语句:strcpy(s1+4,s2); printf(\后,输出结果是( B ). A.tian B.tianbeijing C.tianjinbeijing D.tianbeij 9.合法的数组定义是( B ) A.int a[ ]={\ B.int a[ ]={0, 1, 2, 3, 4, 5}; C.char a={\ D.char a[ ]={0, 1, 2, 3, 4, 5}; 10.若有以下说明,则数值为4的表达式是( D ) int
a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g; A.a[g-c] B.a[4] C.a['d'-'c'] D.a['d'-c] 11.下列语句中,正确的是( D ) A.char a[3][ ]={'abc', 'I'}; B.char a[ ][3]={'abc', 'I'}; C.char a[3][ ]={ 'a', \ D.char a[ ][3]={\12.设有如下定义,则正确的叙述为( C ) char x[]={\char
y[]={'a','b','c','d','e','f','g'}; A.数组x和数组y等价 B.数组x和数组y的长度相同 C.数组x的长度大于数组y的长度 D.数组x的长度小于数组y的长度 二、填空题
1.设有定义语句“int a[3][4]={{1}, {2}, {3}}”,则a[1][1]值为 0 ,a[2][1]的值为 0 。 2.执行“int b[5]={ }, a[ ][3]={1, 2, 3, 4, 5, 6}”后,b[4]= 0 ,a[1][2]= 6 。 3.下面程序的功能是输出数组s中最大元素的下标,请填(空。
main()
{ int k,p;
int s[]={1,-9,7,2,-10,3}; for(p=0,k=p;p<6;p++) k=p; if (s[p]>s[k]) printf(\
} }
习 题 六
一、选择题
1.以下叙述不正确的是( D )。 A.一个C源程序可由一个或多个函数组成 B.一个C源程序必须包含一个main()函数 C.C程序的基本组成单位是函数 D.C程序中的注释说明只能位于一条语句的后面 2.以下关于C语言函数参数的说法不正确的是( B )。 A.实参可以是常量、变量或表达式 以是常量、变量或表达式 B.形参可}
4.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。 #include\main ()
{ int i,j, k ; char str[ ]={ \
for(i=0,j=strlen(str) /2 ; i {k=str[i]; str[i]=str[j];str[j]=k;} } 5.下面程序求5?5方阵的主对角线元素乘积,请填空。 #include { int a[5][5],i,j,ss; printf(\for(i=0;i<5;i++) for(j=0;j<5;j++) scanf(\ss= 1 ; for(i=0;i<5;i++) ss= ss* a[i][j] ; printf(\ss=%d\\n\); } 6.以下程序求任意10个实数的最大值和最小值。 #include float a[10],max,min; for(i=0;i<10;i++) scanf(\max=min=a[0]; for(i=1;i<10;i++) { if(max if(min>a[i]) min=a[i] ; } printf(\最大值=%f\\n\printf(\最小值=%f\\n\} 7.以下程序求二维数组中每行元素的最大值。 #include { int a[M][N],amax,i,j; for(i=0;i for(j=0;j scanf(”%d”,&a[i][j]); for(i=0;i { amax=a[i][0] ; for(j=1;j printf(\ C.实参可以为任意类型 D.形参应与其对应的实参类型一致 3.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是( C )。 A.地址传递 B.由实参传给形参再由形参传回给实参 C.单向值传递 D.由用户指定传递方式 4.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是( B )。 A.float型 B.int型 C.long型 D.double型 5.C语言规定,函数返回值的类型是由( D )。 A.return语句中的表达式类型所决定 B.调用该函数时的主调函数类型所决定 C.调用该函数时系统临时决定 D.定义函数时所指定的函数类型所决定 6.在C语言程序中,以下正确的描述是( C )。 A.函数可以嵌套定义,但不可以嵌套调用 B.函数的定义和调用均可以嵌套 C.函数不可以嵌套定义,但可以嵌套调用 D.函数的定义和调用均不可以嵌套 7.若用数组名作为函数调用的实参,传递给形参的是( A )。A.数组的首地址 B.数组第一个元素的值 C.数组中全部元素的值 D.数组元素的个数 8.如果在一个函数中的复合语句中定义了一个变量,以下关于该变量正确的说法是( A )。 A.只在该复合语句中有效 B.在该函数中有效 C.在本程序范围内均有效 D.为非法变量 9.以下不正确的说法为( D )。 A.在不同函数中可以使用相同名字的变量 B.形式参数是局部变量 C.在函数内定义的变量只在本函数范围内有效 D.在函数内的复合语句中定义的变量在本函数范围内有效 10.以下程序的正确运行结果是( A )。 #include { int k=4,m=1,p; p=func(k,m);printf(\p=func(k,m);printf(\} func(int a,int b) { static int m=0,i=2; i+=m+1; m=i+a+b; return(m); } A.8,17 B.8,16 C.8,20 D.8,8 11.在“文件包含”预处理语句的使用形式中,当#include后面的文件名用<>(尖括号)括起时,寻找被包含的文件的方式是( C )。 A.仅仅搜索当前目录 B.先在源程序所在目录搜索,再按系统设定的标准方式搜索 C.直接按系统设定的标准方式搜索目录 D.仅仅搜索源程序所在目录 12.以下程序的正确运行结果是( A )。 int d=1; fun(int p) { int d=5; d+=p++; printf(\} main() { int a=3; fun(a); d+=a++; printf(\} A.84 B.99 C.95 D.44 13.若有以下调用语句,则不正确的fun()函数的首部是( D )。 main() { … int a[50],n; … fun(n,&a[9]); … } A.void fun(int m,int x[ ]) B.void fun(int s,int h[41]) C.void fun(int p,int *s) D.void fun(int n,int a) 14.下面的程序执行后输出的结果是( A )。 f(int a) { int b=0; static int c=3; b++;c++; return(a+b+c); } main() { int a=2,i; for(i=0;i<3;i++) printf(\\} A.7 8 9 B.7 9 11 C.7 10 13 D.7 7 7 15.以下程序执行后的输出结果是( B )。 int a, b; void fun() { a=100;b=200; } main() { int a=5,b=7; fun(); printf(\} A.100,200 B.5,7 C.200,100 D.7,5 16.下列不属于编译预处理的是( D )。 A.包含文件 B.条件编译 C.宏定义 D.连接 17.下列语句中正确的是( D )。 A.#define MYNAME=\ B.#include string.h C.for(i=0;i<10;i++); D.#include #define Y(n) ((N+1)*n) A.出错 B.42 C.48 D.54 20.以下程序中的for循环执行的次数是( C )。 #include \#define N 2 #define M N+1 #define NUM (M+1)*M/2 main() { int i,n=0; for(i=1;i<=NUM;i++) printf(\} A.5 B.6 C.8 D.9 二、填空题 1.C语言中的函数,从能否可以返回值上可分为 有返回值 函数和 无返回值 函数。 2.定义函数时,在函数头中除有函数名称外,还应有 函数类型 、 参数类型 和 名称 等信息。 3.必须对函数 定义 才能确立函数可实现的功能,只有对函数 调用 才能实现函数的功能。 4.C语言中,函数的调用有 函数语句 、 函数表达式 和 函数实参 三种方式。 5.C语言中,每个变量都有作用域和生存期,变量的作用域是 变量有效范围 ,变量的生存期是 变量作用域 。 { printf(\ 12.以下程序执行后输出的结果是 14 。 #include long sum(register int x,int n) { long s; int i; register int t; t=s=x; for(i=2;i<=n;i++) { t*=x; s+=t; } return(s); } 6.对函数或变量的 声明 是告诉系统此程序段要用到在其后面才定义的函数或变量,使函数或变量的作用域得以扩展。 7.C语言中,变量的存储类型有 4 种,存储方式有 2 种。 8.以下程序的输出结果是 246 。 void fun() { static int a=0; a+=2; printf(\} main() { int cc; for(cc=1;cc<4;cc++) fun() printf(\} 9.以下程序的运行结果是 111 。 main() { increment(); increment(); increment(); } increment() { int x=0; x+=1; printf(\} 10.以下程序执行后输出的结果是 34 。 #include main() { int a=2,i,k; for(i=0;i<2;i++) k=f(a++); printf(\} 11.以下程序执行后输出的结果是 4 。 long fib(int n) { if(n>2) return(fib(n-1)+fib(n-2)); else return(2); } main() main() { int x=2, n=3; printf(\} 13.设有定义如下:#define F(N) 2*N, 则表达式F(2+3)的值是 7 。 14.下面程序的执行结果是 5,6,12 。 #include s=(x++)+(++y); return s; } main() { int a,b,k; a=5;b=6; k=fx(a,b); printf(\} 15.下面程序for循环执行 6 次,程序的运行结果是12345 。 #include #define FMN M+M main() {int i,n=0; for(i=0;i 16.下面程序的执行结果是 0 。 #include { int a,m=5,n=2; a=SR(m-n)/SR(m+n); printf(\} 17.设数组a有50个元素,函数fun1()的功能是按顺序分别给数组a中的元素赋以从2开始的偶数值,函数fun2()则按顺序每五个元素求一个平均值,并将求得的值放在数组s中,在空白处完成该程序。 #include for (i=0,k=2;i } fun2(float a[],float s[]) { float sum=0; int i,k; for(i=0,k=0;i if((i+1)%5==0) { s[k]=sum/5;k++; sum=0 ; } } } main() { float a[N],s[N/5]; int i; fun1(a); fun2(a,s); for(i=0;i printf(\ printf(\ for(i=0;i printf(\} 18.下面程序的运行结果是 abcxyz 。 #include { int k=0; char s1[10]=\strcat(s1,s2); while(s1[k++]!='\\0') s2[k]=s1[k]; puts(s2); } 19.下面程序经宏展开后,程序运行结果是 200 。 #define PR printf(\#define ADD sum+=i main() { int i,sum=0; for(i=10;i<20;i++) ADD; PR; } 习 题 七 一、选择题 1.变量的指针,其含义是指该变量的( B )。 A.值 B.地址 C.名 D.一个标志 2.以下程序中调用scanf()函数给变量a输入数值的方法是错误的,错误原因是( B )。 main() { int *p,*q,a,b; p=&a; printf(\scanf(\*p); ┆ } A.*p表示的是指针变量p的地址 B.*p表示的是变量a的值,而不是变量a的地址 C.*p表示的是指针变量p的值 D.*p只能用来说明p是一个指针变量 3.以下程序错误的原因是( A )。 main() { int *p,i; char *q,ch; p=&i; q=&ch; *p=40; *p=*q; ┆ } A.p和q的类型不一致,不能执行*p=*q;语句 B.*p中存放的是地址值,因此不能执行*p=40;语句 C.q指向具体的存储单元,所以*q没有实际意义 D.q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行*p=*q;语句 4.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是(B )。A.k=*ptr1+*ptr2; B.ptr2=k; C.ptr1=ptr2; D.k=*ptr1*(*ptr2); 5.以下程序运行结果是( B )。 sub(int x ,int y ,int *z) { *z=y-x;} main() { int a ,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(\} A.5,2,3 B.-5,-12,-7 C.-5,-12,-17 D.5,-2,-7 6.下面程序段的运行结果是( A )。 char *s=\s+=2; printf(\A.cde B.字符'c' C.字符'c'的地址 D.无确定的输出结果 7.若有以下定义,则对a数组元素地址的正确引用是(B )。int a[5],*p=a; A.*&a[5] B.a+2 C.*(p+5) D.*(a+2) 8.若有以下定义,则对a数组元素地址的正确引用是( A )。int a[5],*p=a; A.p+5 B.*a+1 C.&a+1 D.&a[0] 9.若有以下定义,则p+5表示( A )。 int a[10],*p=a; A.元素a[5]的地址 B.元素a[5]的值 C.元素a[6]的地址 D.元素a[6]的值 10.若有以下定义,且0≤i<6,则正确的赋值语句是( D )。 int s[4][6],t[6][4],(*p)[6]; A.p=t; B.p=s; C.p=s[i]; D.p=t[i]; 11.下面程序段的运行结果是(A )。 char *format= \int a=1,b=10; a+=b; printf(format, \A.for, \ B.format, printf(\ printf(\ } A.4 4 B.2 2 D.4 6 17.执行以下程序后,y的值是( C )。 main () { int a[]={2,4,6,8,10}; int y=1,x,*p; p=&a[1]; C.2 4 \C.a+=b,a=11,b=10 D.以上结果都不对 12.下面程序段的运行结果是( D )。 char *p= \int a=111,b=10,c; c=a%b; p+=3; printf(p,c,a,b); A.1,a=111,b=10 B.a=1,b=111 C.a=111,b=10 D.以上结果都不对 13.下面程序的运行结果是( A )。 #include \ fun (int **a,int p[2][3]) { **a=p[1][1];} main () { int x[2][3]={2,4,6,8,10,12},*p; p=(int *)malloc(sizeof(int)); fun (&p,x); printf (\} A.10 B.12 C.6 D.8 14.设有如下定义,则以下说法中正确的是( C )。 char *aa[2]={\A.aa数组元素的值分别是\和ABCD\B.aa是指针变量,它指向含有两个数组元素的字符型一维数组 C.aa数组的两个元素分别存放的是含有四个字符的一维字符数组的首地址 D.aa数组的两个元素中各自存放了字符'a'和'A'的地址 15.设有以下定义,则下列能够正确表示数组元素a[1][2]的表达式是( D )。 int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*prt)[3]=a,*p=a[0]; A.*((*prt+1)[2]) B.*(*(p+5)) C.(*prt+1)+2 D.*(*(a+1)+2) 16.下列程序的输出结果是( B )。 main() { int a[5]={2,4,6,8,10},*p,**k; p=a; k=&p; for(x=0;x<3;x++) y+=*(p+x); printf(\} A.17 B.18 C.19 D.20 18.设有如下定义,则执行语句*--p;后*p的值是( B )。 int a[5]={10,20,30,40,50},*p=*a[2]; A.30 B.20 C.19 D.29 19.设有如下定义,则下列程序段中正确的是( C )。 char *st=\ A.char a[11], *p; strcpy(p=a+1,&st[4]); B.char a[11]; strcpy(++a, st); C.char a[11]; strcpy(a, st); D.char a[], *p; strcpy(p=&a[1],st+2); 20.若有以下说明和定义,在必要的赋值之后,对fun()函数的正确调用语句是( B )。 fun(int *c){ } main() { int (*a)()=fun,*b(),w[10],c; ┆ } A.a(w); B.(*a)(&c); C.b=*b(w); D.fun (b); 21.有如下程序,该程序的输出结果是( C )。 main() { char ch[2][5]={\int i,j,s=0; for(i=0;i<2;i++) p[i]=ch[i]; for(i=0;i<2;i++) for(j=0;p[i][j]>'\\0';j+=2) s=10*s+p[i][j]-'0'; printf(\} A.69825 B.63825 C.6385 D. 二、填空题 1.指针运算符&和*分别称为 取址运算 和 间接访问 运算。 2.当用指针变量作为函数参数时,此时的参数传递是 地址 传递。 3.对于二维数组arr[5][5],arr,*arr,&arr[0],arr[2]+3,*(arr+2), *(arr[2]+3)的含义分别是 5行5列元素值,0行地址,0行0列地址,0行地址,2行3列元素地址,2行0列地址,2行3列元素值 。 4.函数的指针是 函数入口地址 。 5.返回指针值的函数是 指针类型的函数 。 6.若有说明语句 int a[3]={1,3,5},*p=a;则*++p,*p++,*p+1的值分别是 3,1,2 。 5、如何判断a是否为质数:背诵这个程序! void iszhishu( int a ) { for(i=2;i if(a%i==0) printf(“不是质数”); printf(“是质数!”); } 6、如何求阶层:n! 背诵这个程序! int fun(int n) { int p=1; for(i=1;i<=n;i++) p=p*i; return p; }