新视野教育二级C语言教程课后习题详解
(以修订版教材为准)
第一章C语言的基础知识
第二节熟悉Visual C++
1. C语言源程序名的后缀是 B
A).exe B).c C).obj D).cp
*C语言源程序的拓展名为.C
2. 下列叙述中错误的是D
A)计算机不能直接执行用C语言编写的源程序
B)C程序经C编译后,生成后缀为.obj的文件是一个二进制文件
C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件
D)后缀为.obj和.exe的二进制文件都可以直接运行
*后缀为.obj的目标文件不能直接运行
3. 用C语言编写的代码程序B
A)可立即执行B)是一个源程序
C)经过编译即可执行D)经过编译解释才能执行
第三节标识符
1. 按照C语言规定的用户标识符命名规则,不能出现在标识符中的是B
A)大写字母B)连接符C)数字字符D)下划线
*标识符的命名中不能出现连接符
2. 以下选项中不合法的标识符是 C
A)print B)FOR C)&a D)_00
*标识符中不能出现“&”
3. 以下叙述中错误的是A
A)用户所定义的标识符允许使用关键字
B)用户所定义的标识符应尽量做到“见名知意”
C)用户所定义的标识符必须以字母或下划线开头
D)用户定义的标识符中,大、小写字母代表不同标识
*用户自定义标识符不允许使用关键字
4. 可在C程序中用作用户标识符的一组标识符是A
A)and B)Date C)Hi D)case _2007 y-m-d Dr.Tom Bigl
* B答案出现了连接符、C答案出现小数点、D答案出现关键字
5. 以下不合法的用户标识符是C
A)j2_KEY B)Double C)4d D)_8_
6. 以下不能定义为用户标识符的是D
A)Main B)_0 C)_int D)sizeof
*sizeof为关键字
7. 下列选项中,不能用作标识符的是D
A)_1234_ B)_1_2 C)int_2_ D)2_int_
*开头第一个字符不能为数字
8. 以下4组用户定义标识符中,全部合法的一组是A
A)_main B)If C)txt D)int
enclude -max REAL k_2
sin turbo 3COM _001
* B答案出现连接符、C答案出现数字开头、D答案出现关键字
第五节整数和实数
1.以下选项中正确的整型常量是 C
A)10110B B)0386 C)0Xffa D)x2a2
2.以下关于long、int和short类型数据占用内存大小的叙述中正确的是D
A)均占4个字节B)根据数据的大小来决定所占内存的字节数
C)由用户自己定义D)由C语言编译系统决定
3.以下选项中不属于C语言的类型的是D
A)signed short int B)unsigned long int
C)unsigned int D)long short
4.以下选项中合法的实型常数是C
A)5E2.0 B)E-3 C).2E0 D)1.3E
5.以下选项中,不能作为合法常量的是 B
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
6.以下选项中可作为C语言合法常量的是A
A)-80. B)-080 C)-8e1.0 D)-80.0e
7.以下符合C语言语法的实型常量是C
A)1.2E0.5 B)3.14.15 9E C).5E-3 D)E15
8.以下不合法的数值常量是C
A)011 B)lel C)8.0E0.5 D)0xabcd
9.以下选项中,合法的一组C语言数值常量是B
A)028 B)12. C).177 D)0x8A
-0xf 4.5e0 Oabc 3.e5
10.下列定义变量的语句错误的是D
A)int _int ; B)double int_; C)long For; D)float US$;
第六节算术表达式与赋值表达式
习题
1.表达式3.6-5/2+1.2+5%2的值是D
A)4.3 B)4.8 C)3.3 D)3.8
*3.6-2+1.2+1=3.8
2.设有定义:float x=123.4567;,则执行以下语句后输出的结果是_____。123.460000 printf("%f\n",(int)(x*100+0.5)/100.0);
*(int)12346.17/100.0=12346/100.0=123.46 格式控制为“%f”
3.设有定义:float a=2,b=4,h=3;,以下C语言表达式与代数式×h 计算结果不相符的是B A)(a+b)*h/2 B)(1/2)*(a+b)*h
C)(a+b)*h*1/2 D)h/2*(a+b)
*因为1/2=0,故B答案结果不相符
第七节自加自减运算符、逗号表达式
习题
1.设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为______。3
*表达式3的值为整个表达式的值
2.设有定义:int k=0;,以下选项的4个表达式中与其他3个表达式的值不相同的是A
A)k++ B)k+=1 C)++k D)k+1
*执行k++,表达式的值为k自加之前的值0
3.有以下程序B
main()
{
char a1='M', a2='m';
printf("%c\n", (a1, a2) );
}
以下叙述中正确的是
A)程序输出大写字母M B)程序输出小写字母m
C)格式说明符不足,编译出错 D)程序运行时产生出错信息
*逗号表达式的值为最后一个表达式的值
4.有以下程序:B
main( )
{ int a=0,b=0;
a =10; /*给a赋值
printf("a+b=%d\n",a+b); /*输出计算结果*/
}
程序运行后的结果是
A)a+b=30 B)a+b=10 C)30 D)程序出错
*本题要注意的是注释部分应该包括:/*给a赋值b=20; 给b赋值*/,也就是说“b=20;”也被系统作为注释处理
第八节字符
1.以下选项中不属于字符常量的是()。B
A)'C' B)"C" C)'0' D)'\072'
2.已知字母A的ASCⅡ代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是()。B
A)kk>='A'&&kk<='Z' B)!(kk>='A'‖kk<='Z')
C)(kk+32)>='a'&&(kk+32)<='z' D)kk>=65 && kk<91
3.已知字符'A'的ASCⅡ代码值是65,字符变量c1的值是'A',c2的值是'D'。执行语句printf("%d,%d",c1,c2-2);后,输出结果是()。C
A)A,B B)A,68 C)65,66 D)65,68
4、以下不合法的字符型常量是B
A)'\x13' B)'\018' C)'65' D)'\n'
5.已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,以下不能将变量c中大写字母转换为对应小写字母的语句是()。D
A)c=c-'Z' + 'z' B)c=c+32
C)c=c-'A' + 'a' D)c='A'+ c-'a'
第九节位运算
1.变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是11110000。若要求将a的高4位取反,低4位不变,所要执行的运算是A
A)a^b B)a|b C)a&b D)a<<4
2.有以下程序
#include
main()
{
int a=1,b=2,c=3,x;
x=(a^b)&c; printf("%d\n",x);
}
程序的运行结果是D
A)0 B)1 C)2 D)3
3.有以下程序
{
unsigned char a=2,b=4,c=5,d;
d=a|b; d&=c; printf("%d\n",d);
}
程序运行后的输出结果是B
A)3 B)4 C)5 D)6
4.若变量已正确定义,则以下语句的输出结果是()。B
s=32; s^=32; printf("%d",s);
A)-1 B)0 C)1 D)32
*两个相同的数进行按位异或,结果为0
5.设有以下语句
int a=1,b=2,c;
c=a^(b<<2);
执行后,c的值为D
A)6 B)7 C)8 D)9
第二章数据输出与输入
第二节数据输出
1.有以下程序段
char ch;
int k;
ch='a';
k=12;
printf("%c,%d,",ch,ch,k);
printf("k=%d\n",k);
已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是D A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零值或不定值
C)a,97,12k=12
D)a,97,k=12
2、有以下程序段:
main()
{ int x,y,z;
x=y=1;
z=x++,y++,++y;
printf(“%d,%d,%d\n”,x,y,z);
}
程序运行后的输出结果是C
A) 2,3,3 B) 2,3,2 C) 2,3,1 D) 2,2,1
*分析过程见教材25页例3
3.有以下程序,其中%u表示按无符号整数输出
main()
{
unsigned short x=0xFFFF;/* x的初值为十六进制数*/
printf("%u\n",x);
}
程序运行后的输出结果是B
A)-1 B)65535 C)32767 D)0XFFFF
4.以下叙述中不正确的是A
A)调用printf函数时,必须要有输出项
B)使用putchar函数时,必须在之前包含头文件stdio.h
C)在C语言中,整数可以以十进制、八进制或十六进制的形式输出
D)使用putchar函数可以不要输出项
5.设有以下程序
main()
{
int c=35; printf("%d", c&c);
}
程序运行后的输出结果是C
A)0 B)70 C)35 D)53
*两个相同的数进行按位与时,结果等于本身
6.以下程序运行后的输出结果是______________。88
main()
{
int x=0210; printf("%X\n",x);
}
*将八进制数转为十六进制数输出
第三节数据输入
1.以下程序运行时若从键盘输入:10 20 30<回车>。输出结果是____。A
#include
main()
{
int i=0,j=0,k=0;
scanf("%d%*d%d",&i,&j,&k);
printf("%d,%d,%d",i,j,k);
}
A)10,30,0 B)10,20,30 C)0,0,0 D)程序出错
*注意%*d为跳过输入的数据
2.已知字符A的ASCII代码值为65,以下程序运行时若从键盘输入:B33<回车>。输出结果是 B
main()
{
char a,b;
a=getchar(); scanf("%d",&b);
a=a-…A?+?0?;
b=b*2;
printf("%c %c",a,b);
}
A)程序段有语法错B)1 B C)1 65 D)1 b
* a=a-…A?+?0?;即a=66-65+48 b=b*2; 即b=33*2 得出结果后找到对应的字符输出
3.有以下程序
main()
{
int m=0256,n=256;
printf("%o %o\n",m,n);
}
程序运行后的输出结果是()。
A)0256 0400 B)0256 256 C)256 400 D)400 400
* m为八进制数n为十进制数%O指输出八进制数输出是不带前导
4.有以下程序
main()
{
int a=666, b=888;
printf("%d\n",a,b);
}
程序运行后的输出结果是()。B
A)错误信息B)666 C)888 D)666,888
* %d只与输出列表中的变量a对应,注意区别printf(“%d\n”,(a,b));
5.设有以下程序
main( )
{
int x=102,y=012;
printf("%2d,%d\n",x,y);
}
执行后输出结果是C
A)10,01 B)02,12 C)102,10 D)02,10
*%d为输出十进制整数,所以要将八进制转为十进制
6.执行以下程序时输入1234567
#include
main()
int a=1,b;
scanf("%2d%2d",&a,&b);printf("%d %d\n",a,b);
}
第三章选择结构
第一节关系运算与逻辑运算
1.已知字母A的ASCⅡ代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是B
A)kk>='A'&&kk<='Z' B)!(kk>='A'‖kk<='Z')
C)(kk+32)>='a'&&(kk+32)<='z' D)isalpha(kk)&&(kk<91)
* isalpha(kk) 检查kk是否为字母,是,返回1,否,返回0
2.当变量c的值不为2、4、6时,值也为“真”的表达式是B
A)(c==2)‖(c==4)‖(c==6) B)(c>=2&&c<=6)‖(c!=3)‖(c!=5)
C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&&c<=6)&&(c%2!=1)
3.以下选项中,当x为大于1的奇数时,值为0的表达式D
A)x%2==1 B)x/2 C)x%2!=0 D)x%2==0
4.以下关于逻辑运算符两侧运算对象的叙述中正确的是()。D
A)只能是整数0和1 B)只能是整数0或非0整数
C)可以是结构体类型的数据D)可以是任意合法的表达式
5.设有定义:int k=1,m=2; float f=7;,则以下选项中错误的表达式是C
A)k=k>=k B)-k++ C)k%int(f) D)k>=f>=m
*强制类型转换的格式必须为:(类型名)表达式
6.设有定义:int a=2,b=3,c=4;,则以下选项中值为0的表达式是A
A)(!a==1)&&(!b==0) B)(!a==1)||(!b==0)
C)a && b D)a||(b+b)&&(c-a)
第二节if语句
1.若变量已正确定义,有以下程序段
int a=3,b=5,c=7;
if(a>b) a=b; c=a;
if(c!=a) c=b;
printf("%d,%d,%d\n",a,b,c);
其输出结果是B
A)程序段有语法错B)3,5,3 C)3,5,5 D)3,5,7
*if表达式后的语句只能是一个语句或者一个复合语句
2.当把以下4个表达式用作if语句的控制表达式时,有一个选项与其他3个选项含义不同,这个选项是D
*前三个是对k%2后的结果进行判断,而D答案是对k进行逻辑非后再除二取余
3.下列条件语句中,功能与其他语句不同的是D
A)if(a) printf("%d\n",x); else printf("%d\n",y);
B)if(a==0) printf("%d\n",y); else printf("%d\n",x);
C)if (a!=0) printf("%d\n",x); else printf("%d\n",y);
D)if(a==0) printf("%d\n",x); else printf("%d\n",y);
*前三个都是当a不等于0时输出x,a等于0时输出y,D答案相反
4.设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是C
A)if(x++) ; B)if(x>y&y!=0);
C)if(x>y)x- - D)if(y<0) {;}
else y++: else x++;
* 无语句结束标志“;”
第三节嵌套的if语句
1.在嵌套使用if语句时,C语言规定else总是C
A)和之前与其具有相同缩进位置的if配对B)和之前与其最近的if配对
C)和之前与其最近的且不带else的if配对D)和之前的第一个if配对
2.有以下程序
main( )
{ int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d\n",d);
else if((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2)
}
执行后输出结果是D
A)2 B)3 C)4 D)编译时有错,无结果* 无语句结束标志“;”
第四节条件表达式、switch语句、goto语句
1.以下程序段中与语句k=a>b?(b>c?1:0):0;功能等价的是A
A)if((a>b) &&(b>c) ) k=1; B)if((a>b) ||(b>c) ) k=1;
else k=0; else k=0;
C)if(a<=b) k=0; D)if(a>b) k=1;
else if(b<=c) k=1; else if(b>c) k=1;
else k=0;
2.下列叙述中正确的是D
A)break语句只能用于switch
B)在switch语句中必须使用default
D)在switch语句中,不一定使用break语句
*break还能用于循环体中
3.有以下程序段
int k=0,a=1,b=2,c=3;
k=ac?c:k;
执行该程序段后,k 的值是 B
A)3 B)2 C)1 D)0
4.有以下程序
#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;
case 3: a++; b++;
}
printf("a=%d,b=%d\n",a,b);
}
程序的运行结果是 D
A)a=1,b=0 B)a=2,b=2 C)a=1,b=1 D)a=2,b=1 * 考点:switch后有无break
5.以下程序的输出结果是C
main( )
{ int a=5,b=4,c=6,d;
printf("%d\n",d=a>b?(a>c?a:c):(b));
}
A)5 B)4 C)6 D)不确定
第四章循环结构
第一节while语句
习题
1.有以下程序
main()
while(y--); printf("y=%d\n",y);
}
程序执行后的输出结果是B
A)y=0 B)y=-1C)y=1 D)while构成无限循环
* 此题考点为循环体语句为空语句,当y—表达式的值为0时结束循环,故y的值为-1
2.有以下程序
main()
{
int k=5;
while(--k) printf("%d",k-=3);
printf("\n");
}
执行后的输出结果是A
A)1 B)2 C)4 D)死循环
*① k=5时,执行--k后, k=4,表达式的值为4,为真,执行输出语句k-=3,k=1,输出1
②再次执行--k表达式,k=0,表达式的值为0,结束循环
第二节do-while语句
1.若变量已正确定义,有以下程序段
i=0;
do
printf("%d,",i);
while(i++);
printf("%d\n",i)
其输出结果是 B
A)0,0 B)0,1 C)1,1 D)程序进入无限循环
* 执行第一个输出语句时,输出i的值为0;执行while语句,循环体语句为空,i++表达式的值为0是i 的值为1,执行最后一个输出语句时输出i的值为1
2.有以下程序段
int n,t=1,s=0;
scanf("%d",&n);
do{ s=s+t; t=t-2; }while (t!=n);
为使此程序段不陷入死循环,从键盘输入的数据应该是 D
A)任意正奇数B)任意负偶数C)任意正偶数 D)任意负奇数
3.以下程序的功能是:将输入的正整数按逆序输出。例如,若输入135,则输出531,请填空。n/=10 #include
main()
{
int n,s;
printf("Enter a number:"); scanf("%d",&n);
printf("Output: ");
{
s=n%10; printf("%d",s);
_____;
} while(n!=0);
printf("\n");
}
*答案:n=n/10
分析:假如输入的值为135,那么n=135
(1)n=135,do:s=n%10,那么s的值为5,输出s的值为5。接着我们要输出3才能将n逆序输
出。在学习%和/的时候总结过:135/10=13,135%10=5,因此我们试着将后面的空填上n=n/10,那么n的值为13,判断(n!=0)为真。
(2)n=13,do:s=n%10,那么s的值为3,输出s的值为3。执行n=n/10后n的值为1,判断(n!=0)
为真。
(3)n=1,do:s=n%10,那么s的值为1,输出s的值为1。执行n=n/10后n的值为0,判断(n!=0)
为假,结束循环。
(4)已经得到逆序的结构为:531,说明我们所要填的空就是n=n/10。
4.有以下程序
main()
{
int k=5,n=0;
do
{
switch(k)
{case 1: case 3:n+=1; break;
default :n=0;k--;
case 2: case 4:n+=2;k--;break;
}
printf(“%d”,n);
}while(k>0&&n<5);
}
程序运行后的输出结果是
A)235 B)0235 C)02356 D)2345
*本题注意的是在循环第一次进入switch语句的时候是执行的default后面的语句块,由于没有break,所以还会执行case2:case4:后面的语句。
第三节for语句
1.有以下程序
#include
main()
{
int x=8;
for( ; x>0; x--)
{
printf("%d, ",x--);
continue;
}
printf("%d, ",--x);
}
}
程序的运行结果是D
A)7,4,2 B)8,7,5,2 C)9,7,6,4 D)8,5,4,2
* 考点:for循环、if语句、continue
分析:
(1)x=8,x>0为真,判断:x%3的值2为真,执行输出语句,输出x—的值为8,x为7。遇
到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为6。
(2)x=6,x>0为真,判断:x%3的值0为假,执行if后面的语句,输出—x的值为5,x为5。
接着执行for结构中的表达式3,x—后x的值为4。
(3)x=4,x>0为真,判断:x%3的值1为真,执行输出语句,输出x—的值为4,x为3。遇
到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为2。
(4)x=2,x>0为真,判断:x%3的值2为真,执行输出语句,输出x—的值为2,x为1。遇
到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为0。
(5)x=0,x>0为假,结束循环。
(6)最终输出的结果为:8,5,4,2
2.以下不构成无限循环的语句或者语句组是A
A)n=0; B)n=0;
do{++n;}while(n<=0); while(1){n++;}
C)n=10; D)for(n=0,i=1; ;i++) n+=i;
while(n); {n--;}
* 构成死循环的情况:1、表达式的值永远为真;2、缺省表达式2.
第四节循环结构的嵌套
1.有以下程序
main( )
{
int i,n=0;
for(i=2;i<5;i++)
{
do
{
if(i%3) continue;
n++;
} while(!i);
printf("n=%d\n",n);
}
程序执行后的输出结果是D
A)n=5 B)n=2 C)n=3 D)n=4
* 执行过程:
(1)、n=0,i=2时,i<5为真,i%3为真,执行continue,结束本次循环,!i为假,执行最后n++,n=1,执行i++
(2)、
2.有以下程序
main()
{
int i,j,x=0;
for(i=0;i<2;i++)
{
x++;
for(j=0;j<=3;j++)
{
if(j%2) continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
程序执行后的输出结果是B
A)x=4 B)x=8 C)x=6 D)x=12
* 程序执行过程:(1)、x=0,i=0时,i<2为真,执行x++,x=1
j=0,j<=3为真,j%2为假,执行x++,x=2,再执行j++
j=1,j<=3为真,j%2为真,执行continue,再执行j++
j=2,j<=3为真,j%2为假,执行x++,x=3,再执行j++
j=3,j<=3为真,j%2为真,执行continue,再执行j++
j=4,j<=3为假,结束内层循环,执行最后一个x++,x=4,再执行i++
(2)、x=4,i=1时,i<2为真,执行x++,x=5
j=0,j<=3为真,j%2为假,执行x++,x=6,再执行j++
j=1,j<=3为真,j%2为真,执行continue,再执行j++
j=2,j<=3为真,j%2为假,执行x++,x=7,再执行j++
j=3,j<=3为真,j%2为真,执行continue,再执行j++
j=4,j<=3为假,结束内层循环,执行最后一个x++,x=8,再执行i++
(3)、x=8,i=2时,i<2为假,结束循环,输出x
3.下面程序的功能是输出以下形式的金字塔图案
*
*****
*******
main( )
{
int i,j;
for(i=1;i<=4;i++)
{
for(j=1;j<=4-i;j++) printf(" ");
for(j=1;j<=_______;j++) printf("*");
printf("\n");
}
}
在下划线处应填入的是B
A)i B)2*i-1 C)2*i+1 D)i+2
*分析:
通过观察可以知道:第一行只有一个*号,却在*的前面有三个空格。第二行有三个*号,*号前面有两个空格。第三行有五个*号,在*号前面仅仅有一个空格。第四行有七个*号,没有空格。从中可以得到如下规律:
用i代表行数,共有4行:
i=1时,有4-i个空格,有2*i-1个*号
i=2时,有4-i个空格,有2*i-1个*号
i=3时,有4-i个空格,有2*i-1个*号
i=4时,有4-i个空格,有2*i-1个*号
结合程序即可得到正确结果。
第五节break和continue语句在循环中的应用
1.以下叙述中正确的是C
A)break语句只能用于switch语句体中
B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环
C)break 语句只能用在循环体内和switch语句体内
D)在循环体内使用break语句和continue语句的作用相同
第六节循环结构的分析方法
1.以下程序段中的变量已正确定义
for(i=0;j<4;i++,i++)
for(k=1;k<3;k++); printf("*");
程序段的输出结果是()D
A)******** B)**** C)** D)*
* 循环体为空语句
第五章函数
第一节函数的定义、库函数
A)函数定义时在函数首部所说明的函数类型
B)return语句中表达式值的类型
C)调用函数时主函数所传递的实参类型
D)函数定义时形参的类型
第二节函数的调用与函数说明
1.有以下程序
#include
int f(int x)
{
int y;
if(x==0||x==1) return (3);
y=x*x-f(x-2);
return y;
}
main()
{
int z;
z=f(3);
printf("%d\n",z);
}
程序的运行结果是C
A)0 B)9 C)6 D)8
*解析:
将f(3)的值的赋值给变量z,当执行到f函数时将3的值传递给变量x,则x得到的值为3,执行函数中的语句,则x==0||x==1表达式的值为假值,则不返回3值,执行后面的语句y=x*x-f(1) .先执行f(1)函数,则将1的值传递给变量x ,所以变量x得到的值为1,执行后面的语句x==0||x==1表达式的值为真值,返回3值,最后计算y=3*3-3=6,所以最后的答案为6,选择答案C。
2.以下叙述中错误的是C
A)改变函数形参的值,不会改变对应实参的值
B)函数可以返回地址值
C)可以在函数内部定义函数
D)调用sin函数需要包含头文件math.h
3.若程序中定义了以下函数
double myadd(double a, double b)
{
return (a+b);
}
并将其放在调用语句之后,则在调用之前应进行函数声明,以下选项中错误的是A
A)double myadd(double a, b); B)double myadd(double, double);
C)double myadd(double b, double a); D)double myadd(double x, double y);
* 参数名可以缺省,类型名不能缺省
第三节函数的数据传递
1.有以下程序
void f(int v , int w)
{
int t;
t=v;v=w;w=t;
}
main( )
{
int x=1,y=3,z=2;
if(x>y)
f(x,y);
else if(y>z)
f(y,z);
else
f(x,z);
printf("%d,%d,%d\n",x,y,z);
}
执行后输出结果是C
A)1,2,3 B)3,1,2 C)1,3,2 D)2,3,1
* 分析:f函数的功能是:交换两个变量的值,但是变量v和w为普通变量,所以只是在f 函数中改变了变量的值,但是在主函数中并没有改变实参的值。所以变量x、y、z的并没有改变。所以主函数中x、y、z的值还是原来变量的值,即1,3,2.故选答案C。
2.以下程序的输出结果是_________。1 3
#include
void fun(int x)
{
if(x/2>0)
fun(x/2);
printf("%d ",x);
}
main()
fun(3);
printf("\n");
}
* 分析:
先执行fun(3)把x/2的值为1,真值,执行fun(1),再次调用fun函数,则输出的x的值,即1。输出结束,fun(1),函数结束,则执行后面的这一条printf函数,即输出3的值。最后的结果为:13.
第六章指针
第一节变量的地址和指针
1.以下叙述中错误的是C
A)改变函数形参的值,不会改变对应实参的值
B)函数可以返回地址值
C)可以给指针变量赋一个整数作为地址值
D)当在程序的开头包含文件stdio.h时,可以给指针变量赋NULL
2.以下定义语句中正确的是D
A)int a=b=0 ; B)char A=65+1,b='b';
C)float a=1,*b=&a,*c=&b ; D)double a=0.0;b=1.1;
* A答案b未定义、C答案c是一级指针、D答案分号是C语言语句的结束标志
3.设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是D
A)float *p=1024; B)int *p=(float x);
C)float p=&x; D)float *P=&x;
* 分析:A答案float *p=1024,将一个常量1024赋值给指针,赋值号两边的类型错误。B 答案int *p=(float x);将一个float类型的变量x赋值给指针变量p是错误的。C答案float p=&x;将x的地址赋值给变量p是错误的。D答案float *p=&x;将变量x的地址赋值给指针p,因此是正确的。
第二节指针变量赋值及运算
1.设有定义:int n=0,*p=&n,**q=&p;,则以下选项中,正确的赋值语句是D
A)p=1; B)*q=2; C)q=p; D)*p=5;
* 分析:int n=0,*p=&n,**q=&p;定义了一个普通变量n赋初始值为0,一个一维指针p 指向了n的地址,一个二维指针q指向了p的地址。
A答案p=1,将常量1赋值给一维指针是错误的,类型不一致。
B答案*q=2,因为q是二维指针,因此*q可以理解为一维的指针,将2赋值给*q类型不一致。
C答案q=p,q和q的类型不一致,因此不能直接赋值。
2.有以下程序
main()
{
int a=1,b=3,c=5;
int *p1=&a, *p2=&b, *p=&c;
*p=*p1*(*p2);
printf("%d\n",c);
}
执行后的输出结果是C
A)1 B)2 C)3 D)4
* 分析:int a=1,b=3,c=5;int *p1=&a,*p2=&b,*p=&c;p1指向了a的地址,p2指向了b的地址,p指向了c的地址。 *p=*p1*(*p2);计算*p1和*p2的乘积,注意中间的*号表示乘号。即*p=1*3值为3,由于p指向了c的地址,*p的值为3那么c的值为3。
3.设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是A
A)*p=*q; B)p=q; C)*p=&n1; D)p=*q;
* 分析:int n1=0,n2,*p=&n2,*q=&n1;首先定义了两个整型变量n1和n2,并为n1赋值为0,定义了两个指针变脸p和q,p指向了n2的地址,q指向了n1的地址。可以用“间接访问运算符”来引用相应的存储单元,因此*p就是n2的值,*q就是n1的值。与n2=n1等价的就是*p=*q,故选择A答案。
4.有以下程序
#include
main()
{
int n,*p=NULL;
*p=&n;
printf("Input n: "); scanf("%d",&p);
printf("output n: "); printf("%d\n",p);
}
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是A
A)int n,*p=NULL; B)*p=&n;
C)scanf("%d",&p) D)printf("%d\n",p);
*分析:通过一个空指针去访问一个存储单元时,将会得到一个出错信息。
第三节函数之间地址值的传递
1.以下程序的功能是:利用指针指向3个整型变量,并通过指针运算找出3个数中的最大值,输出到屏幕上,请填空:*pmax=x; (或者max=x)
main()
{
int x,y,z,max,*px,*py,*pz,*pmax;
scanf("%d%d%d",&x,&y,&z);
py=&y;
pz=&z;
pmax=&max;
__________________
if(*pmax<*py)
*pmax=*py;
if(*pmax<*pz)
*pmax=*pz;
printf("max=%d\n",max);
}
* 进行比较之前对其进行赋初值
2.void f( int y, int *x)
{ y=y+*x; *x=*x+y;}
main( )
{ int x=2,y=4;
f(y,&x);
printf("%d %d\n",x,y);
}
执行后输出的结果是。8 4
*分析:
(1)首先函数从main函数开始执行,在main函数中定义了两个变量x=2,y=4,调用函数f(y,&x),这里传入的一个是y的值,一个是x的地址。
(2)执行函数f,形参y的值为4,x指针指向实参x的地址。执行:y=y+*x,那么y=4+2,值为6,*x=*x+y那么*x=2+6,由于调用函数传入的是地址,因此形参*x的值变化那么实参x的值也相应变化为8。
(3)函数执行完毕,继续执行main函数中的输出语句,输出x, y的值为8,4。
3.以下程序的输出结果是__________。 3 5
#include
void swap(int *a,int *b)
{
int *t;
t=a; a=b; b=t;
}
main()
{
int i=3, j=5, *p=&i, *q=&j;
swap(p,q);
printf("%d %d\n",*p,*q);
}
*分析:
(1)函数从main函数开始执行,定义了两个变量x和y,值为3和5,指针p和q分别指向了x和y的地址,调用函数swap(p,q),传入的实参为p和q。