C语言程序设计期末复(预)习知识点整理

C语言程序设计期末复(预)习知识点整理,第1张

C语言程序设计期末复(预)习知识点整理 第一章 C语言概述

1.任何一个程序都必须有而且只能有一个main函数。

2.调用printf函数前,应使用编译预处理命令#include

3.C风格的注释(块注释)不可以嵌套。

4.C语言中的所有语句都必须以分号结束。

5.C语言是面向过程的程序设计语言。

6.C语言源程序的扩展名是c。

7.C语言规定:在一个源程序中,main函数的位置可以任意;

8.C语言程序从程序中的main函数开始执行。

9.C语言的运行方式采用的是编译方式,也就是现将程序翻译成目标程序,再运行程序。

第二章 程序的灵魂——算法

1.算法的表示方法:

自然语言表示算法、流程图表示算法、NS图表示算法、伪代码表示算法、计算机语言表示算法;

2.c语言的基本结构:顺序结构、选择结构、循环结构;

3.结构化程序设计的思想是将一个复杂的事情分解为多个阶段进行分别进行处理的。

4.算法的特性:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性;

5.算法的步骤必须是有限的。

第三章 顺序程序设计

标识符由下划线,数字和字母组成,并且不能以数字开头。关键字不能作为标识符。

例:下列 C语言用户标识符中合法的是()

A、3ax;

B、x;    

C、case;

D、-e2;

参考答案:B

题目解析:A不能数字开头。C为c语言关键字。D不能负号开头

1.若有定义:int a=2; 则正确的赋值表达式是()

A、a-=(a*3);

B、double(-a);

C、a*3; 

D、a*4=3;

参考答案:A

题目解析:D.算术表达式不能作为左值;B.C明显错误

2.若有定义:int x=1111,y=222,z=33;则语句printf("%4d+%3d+%2d",x,y,z);
运行后的输出结果为()

A、111122233;

B、1111,222,33;

C、1111   222  33;

D、1111+222+33;

参考答案:D

题目解析:%4d中表示右对齐4位,同理可知答案

3.已知如下定义和输入语句:
int a,b; 
scanf("%d,%d",&a,&b);
若要求a、b的值分别为11和22,正确的数据输入是哪一个?()

A、11 22;

B、11,22;

C、a=11,B=22;

D、11;22;

参考答案:B

题目解析:数据输入中格式为:%d,%d则应为11,22;普通字符原样输入。

4.若已定义:int i=3,k;  则语句 k=(i++)+(--i); 按左结合原则,运行后k的值()

A、4;

B、5;

C、6;

D、7;

参考答案:C

5.语句a=(3/4)+3%2;运行后,a的值为()

A、0;

B、1;

C、2;

D、3;

参考答案:B

题目解析:a=0+3%2;整数相除的整数a=0+1;3除以2的余数为1,a=1;

6.设整型变量 a=2,则执行下列语句后,浮点型变量b的值不为 0.5 的是()

A、b=1.0/a;          

B、b=(float)(1/a);  

C、b=1/(float)a;      

D、b=1/(a*1.0);

参考答案:B

题目解析:B为0.0

7.已知字母 A 的 ASCII 码为十进制的 65,下面程序 的输出是()
#include
void main()
{char ch1,ch2;
ch1='A'+'5'-'3';
ch2='A'+'6'-'3';
printf("%d,%cn",ch1,ch2);
}

A、67,D;

B、B,C;

C、C,D;

D、不确定的值;

参考答案:A

题目解析:%d输出的是ASCII 码为十进制的值。%c输出的是字符

8.若有定义 int x=3,y=2 和 float a=2.5,b=3.5,则表达 式:(x+y)%2+(int)a/(int)b 的值是()

A、0;

B、2;

C、1.5;

D、1;

参考答案:D

题目解析:(x+y)%2值为:1     (int)a/(int)b结果为:0

9.若 d 为 double 型变量 ,则表达式 d=1,d+5,d++ 的值是()

A、1;

B、6.0;

C、2.0;

D、1.0;

参考答案:D

题目解析:逗号表达式从左到右执行,取最后一个表达式的值。首先d=1;然后d+5没有赋值给别的变量,不起作用;d++在表达式结束前不起作用,所以d仍为1.因为为double,最终结果为:1.0

10.在不同的计算机系统中,不同的C语言系统中,其各种数据类型所占据的存储空间是不同的,但是有一个总的原则,即:char<=short<=int<=long<= float<=double

11.下面四个选项中,合法的浮点数的选项是 (      ) 。

A、-.60      

B、5e-9.4  

C、123e      

D、-e3 

参考答案:A

题目解析:阶码不能为小数; 浮点数的尾数及阶码不能用八进制数表示;指数必须是整数;浮点数不能缺少尾数。e的左右两边要有数字。

12.下面四个选项中,均是不合法的整型常量的选项是(  )     

A、-0x48eg

        -068

        03f

B、--0f1    

        -0xffff  

        0011     

C、-0xcdf     

        017      

        12,456   

D、-018   

        999   

        5e2   

参考答案:A

题目解析:A1:--0f1十六进制数没有0x,显然不合法,这里需要讨论的是常量前面允许不允许加上--号,是否可以负负得正,显然不可以,--在C中是自减运算,它只适用于变量;B1:0xcdf  X大写也可以!C3:5e2是个实型数。

13.对代数式(4ad)/(bc),不正确的C语言表达式是()

A、(4*a*b)/(b*c);

B、a/b/c*d*4;

C、4*a*d/b*c;

D、a*d/c/b*4;

参考答案:C

题目解析:C应为4*a*b/(b*c)

14.在下列选项中 ,不正确的赋值语句是 ()

A、t++;

B、n1=(n2=(n3=0));

C、k=i=j;

D、a=b+c=1;

参考答案:D

题目解析:D不能直接赋值。

第四章 选择结构程序设计

1.逻辑运算符中,运算优先级按从高到低依次为!>&&> ||

2.C语言中,关系表达式和逻辑表达式的值是1或0。

3.设a为整型变量,不能正确表达数学关系: 10

A、10

B、a==11||a==12||a==13||a==14;

C、a>10&&a<15;

D、!(a<=10)&&!(a>=15);

参考答案:A

题目解析:c语言不能有如a

4.为表示关系  x≥y≥z, 应使用的C语言表达式是()

A、(x>=y)&&(y>=z);

B、(x>=y)AND(y>=z);

C、(x>=y>=z);

D、(x>=y)&(y>=z);

参考答案:A

题目解析:B中不能使用AND。C中不能有这样的表达式。D中&为取地址符号

5.阅读下面的程序:如果从键盘上输入 1234567<回车 >,则程序的运行结果是()
#include
void main()
{
int i,j;
scanf("%3d%2d",&i,&j);
printf("i=%d,j=%dn",i,j);
}

A、i=123,j=4567;

B、i=1234,j=567;

C、i=1,j=2;

D、i=123,j=45;

参考答案:D

题目解析:%nd 为长度n整数

6.表达式 5!=3 的值是()

A、T;

B、非零值;

C、0;

D、1;

参考答案:D

题目解析:在C语言里!的意思是“非”,5 != 3就是5非等于3,就是5不等于3,这逻辑是对的,所以值是1;如果为3!= 3的话,值就为0了。

7.下列程序执行后的输出结果是()
#include
void main( )
{ int a=5,b=60,c;
if (a {c=a*b;printf("%d*%d=%dn",b,a,c);}
else
{c=b/a;printf("%d/%d=%dn",b,a,c);}
}

A、60/5=12;

B、300;

C、60*5=300;

D、12;

参考答案:C

题目解析:题中因为c

8.有如下程序,输出的结果为()
#include
void main( )
{ int x=1,a=0,b=0;
switch(x)
{
case 0: b++;
case 1: a++;
case 2: a++;b++;
}
printf("a=%d,b=%dn",a,b);
}

A、a=2,b=1;

B、a=1,b=1;

C、a=1,b=0;

D、a=2,b=2;

参考答案:A

题目解析:x=1,执行switch里面的case 1:a++,执行完后a=1;继续执行case 2:a++,b++ 里面的内容a=2,b=1;既最终输出结果:a=2,b=1

第五章 循环结构程序设计

1.C 语言中 while 和 do-while 循环的主要区别是do-while 的循环体至少无条件执行一次;

2.continue的意思是跳到循环开始,然后判断循环条件,进行新一轮的循环。

3.for 循环、while 循环和 do while 循环结构之间可以相互转化。

4.对于for(表达式1;;表达式3)可理解为()

A、for( 表达式 1;0;表达式 3);

B、for( 表达式 1;1;表达式 3;)

C、for( 表达式 1;表达式 1;表达式 3);

D、for( 表达式 1;表达式 3;表达式 3);

参考答案:B

题目解析:对于for(表达式1;;表达式3)中,省略部分“表达式2”为真,既为1;

5.break;语句执行时退出到包含该 break;语句的所有循环外。

A、正确   B、错误

参考答案:B

题目解析:只能退出当前的break;循环。

6.C语言中()

A、不能使用do-while语句构成的循环;

B、do-while语句构成的循环必须用break语句才能退出;

C、do-while语句构成的循环,当while语句中的表达式值为非零时结束循环;

D、do-while语句构成的循环,当while语句中的表达式值为零时结束循环;

参考答案:D

题目解析:A do-while 本来就是循环语句。B do-while 语句,等到 while 条件为0时也可以退出,用return 也可以退出。C和D刚好相对。0 是表示假,非0是真,所以选D

7.do-while()循环的最后一个while()后面不能加分号。

A、正确  B、错误

参考答案:B

题目解析:分号不能够丢。

8.while 后的表达式只能是逻辑或关系表达式。

A、正确

B、错误

参考答案:B

题目解析:还可以是常量

9.从语法角度看,for( 表达式 1;表达式 2;表达式 3)语句中的 3个表达式均可省略。

A、正确

B、错误

参考答案:A

题目解析:语法来讲可省略,但实际没什么意义。

10.对下面程序段描述正确的是()
int x=0,s=0;
while (!x!=0) s+=++x;
printf("%d",s);

A、运行程序段后输出 0 ;

B、运行程序段后输出 1;

C、程序段中的控制表达式是非法的;

D、程序段循环无数次;

参考答案:B

题目解析:1 !x!=0表示(!x)!=0,!运算优先于!=运算。2 在C语言中,若有a!=0,则查以简写为a。因此!x!=0可以简写为!x。即while(!x!=0) 或以简写为:while(!x) 还可以写为:while(x==0)

11.若i为整型变量 ,则以下循环语句的循环次数是()
for(i=2;i==0;)
printf("%d",i--);

A、0;

B、1;

C、2;

D、3;

参考答案:A

题目解析:由于没有设i的变化,所以程序会直接拿i=2的值作条件判断,2==0不成立,所以退出。

12.若有定义int x,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x++) : (y++)中的条件表达式(x-y) 等价的是()

A、(x-y<0||x-y>0);

B、(x-y<0);

C、(x-y>0);

D、(x-y==0);

参考答案:A

题目解析:表达式x-y和x-y>0||x-y<0的逻辑值相同,x!=y的情况下x-y和x-y>0||x-y<0的逻辑值都是true。x==y的情况下x-y和x-y>0||x-y<0的逻辑值都是false,可自行上机对x、y值进行测试.

13.下面程序的输出结果是()
#include
void main( )
{ int x=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d %d ",x--,y);
}

A、10 1 9 2;

B、9 8 7 6;

C、10 9 9 0;

D、10 10 9 1;

参考答案:D

题目解析:

第一个循环:i=0,x=10>8,输出x--=10,x现在为9,y=10,输出10 10
y=++i后,y=1,i=1
第二个循环:x=9>8,输出x--=9,x现在为8,y=1,输出9 1
y=++i后,y=2,i=2
第二个循环:x=8不满足循环条件x>8,循环结束

14.下面程序段中 ,循环体的执行次数是()
int a=10,b=0;
do {b+=2;a-=2+b;} while(a>=0);

A、2;

B、3;

C、4;

D、5;

参考答案:B

题目解析:第一次b=2,a=6;第二次b=4,a=0;满足while(a>=0)循环第三次。

15.循环 for(  ;  ;  ) 的循环条件始终为真。

A、正确  B、错误

参考答案:A

题目解析:for循环里面的省略的都为真。

16.以下程序段:()
int x=-1;
do{
   x=x*x;
}
while(!x);

A、是死循环;

B、循环执行二次;

C、循环执行一次;

D、有语法错误;

参考答案:C

题目解析:当x值为0时,!x为真执行循环体

17.以下程序段的执行结果是()
int i,j,m=0;
for(i=1;i<=15;i+=4)
for(j=3;j<=19;j+=4)
m++;
printf("%dn",m);

A、12;

B、15;

C、20;

D、25;

参考答案:C

题目解析:

(1)int i,j,m=0;
(2)for ( i=1;i<=15;i+=4 )
(3) for ( j=3;j<=19;j+=4 )
(4) m++;
(5)printf("%dn",m);
执行步骤:
(1)m=0
(2)i=1,因为i<=15成立开始i循环
(3)j=3,因为j<=19成立开始j循环
(4)m=1
(3)j=7,因为j<=19成立继续j循环
(4)m=2
(3)j=11,因为j<=19成立继续j循环
(4)m=3
(3)j=15,因为j<=19成立继续j循环
(4)m=4
(3)j=19,因为j<=19成立继续j循环
(4)m=5
(3)j=23,因为j<=19不成立结束j循环。【结论:对于每个i值循环一次m自加5次,因为j循环的次数与i值等于多少无关】
(2)i=5,因为i<=15成立继续i循环:(3)(4)会导致m自加5次,m=10
(2)i=9,因为i<=15成立继续i循环:(3)(4)会导致m自加5次,m=15
(2)i=13,因为i<=15成立继续i循环:(3)(4)会导致m自加5次,m=20
(2)i=17,因为i<=15不成立结束i循环
(5)输出:20并换行

18.有如下程序 ()
#include
void main()
{ int x=23;
do
{ printf("%d",x--);
}while(!x);
}

A、321;

B、23;

C、不输出任何内容;

D、陷入死循环;

参考答案:B

题目解析:先执行do的部分,输出23,然后x变为22,因为x(22)不为0,所以循环结束
while(!x)即while(x==0)

第六章 数组

1.数组在定义的时候必须指定大小。

2.数组下标从0开始。若有定义:int a[10]; 使用数组元素时,下标的最小值是 1,最大值是 9。

3.数组下标只能是整型常量或整型表达式。

4.一维数组的元素实质上就是一个变量,代表内存中的一个存储单元。

5.一个数组可以存储一种数组类型的数据。

6.字符串复制函数strcpy(str1,str2) 是将字符串 str2 复制到字符串 str1 之后。

7.字符串比较函数 strcmp() 用于对两个字符串进行比较(区分大小写)。只要两个字符串都以''结尾就可以比较。例如:"abc"小于"abcd"。

8.字符串连接函数strcat(str1,str2) 是将字符串 str2 连接到字符串 str1 之后。

1.以下对一维整型数组 a 定义正确的是()

A、int a(10);

B、int n=10,a[n];

C、int n;scanf("%d",&n); int a[n];

D、#define SIZE 10  int a[SIZE];

参考答案:D

题目解析:A中应为a[10];BC数组长度不能为变量

2.以下能对二维数组 a 进行正确说明和初始化的语句是 ()

A、int a()(3)={ (1,2,3),(2,4,6)};

B、int a[2][]={{3,2,1},{5,6,7}};

C、int a[][3]={{3,2,1},{5,6,7}};

D、int a(2)()={(1,2,3),(2,4,6)};

参考答案:C

题目解析:在定义时可以对部分元素赋初值而省略第1维的长度。

3.下面程序的运行结果是()
#include main()  
{ int a[3][3]={1,2,3,4,5,6,7,8,9},i;
 for(i=0;i<=2;i++)
 printf("%d  ",a[i][2-i]); }

A、3  5  7 ;

B、3  6  9;

C、1  5  9 ;

D、1  4  7;

参考答案:A

题目解析:循环分别为:a[0][2]=3;a[1][1]=5;a[2][0]=7。

4.以下对 C语言字符数组描述错误的是()

A、字符数组可以存放字符串;

B、字符数组中的字符串可以整体输入或输出;

C、可以在赋值语句中通过赋值运算符” =”对字符数组整体赋值;

D、不可以用关系运算符对字符数组中的字符串进行比较;

参考答案:C

题目解析:字符串数组不可以在赋值语句中通过赋值运算符” =”对字符数组整体赋值;

5.用 scanf 函数输入一个字符串到数组 str 中,下面正确的语句是()

A、scanf("%s",&str);

B、scanf("%c",&str[10]);

C、scanf("%s",str[10]);

D、scanf("%s",str);

参考答案:D

题目解析:定义str[10] 为 char数据类型,则str[10]是一个数组,str表示数组所在的内存段的头地址。而scanf()函数所需要的地址,其实质就是一段数据所对应的内存段的起始地址,str已经是其数据所在的内存段的头地址,自然不需要“&”取值。B中%c错误;C中str[10]错误;

6.如有说明:char s1[5],s2[7]; 要给数组s1和s2整体赋值,下列语句中正确的是()

A、s1=getchar(); s2=getchar();

B、scanf("%s%s",s1,s2);

C、scanf("%c%c",s1,s2);

D、gets(s1,s2);

参考答案:B

题目解析:A) s1=getchar(); s2=getchar();getchar是给char类型赋值的, 而s1和s2都是数组,类型不匹配。错误。
B) scanf("%s%s",s1,s2);标准的字符串输入 用%s输入字符串。 正确。
C) scanf("%c%c",s1,s2);
和A类似 %c是赋值字符的,不是字符串。 这个语句只能赋值第一个字符,并不是整体。
D) gets(s1,s2);gets只能有一个参数。 参数错误如果是gets(s1); gets(s2);这样就对了。

第七章 函数

1.C 语言中函数返回值的类型是由函数定义时指定的类型决定的。

2.定义函数时的参数是“形式参数”,调用函数时的参数是“实际参数”。

3.函数调用可以嵌套,函数定义不能嵌套。

4.函数中的多个 return 语句,可以实现调用该函数后,也只能有一个返回值。

5.在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们.在该复合语句以外是不能使用这些变量的。

6.在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是单向值传递(实参传给形参)

1.如果某个函数在定义时省略了存储类型,则默认的存储类型是int。

A、正确    B、错误

参考答案:B

题目解析:int是数据类型不是存储类型,存储类型是extern

2.以下说法中正确的是()

A、C语言程序总是从第一个定义的函数开始执行;

B、在C语言程序中,要调用的函数必须在 main()函数中定义;

C、C语言程序总是从 main()函数开始执行;

D、C语言程序中的 main()函数必须放在程序的开始部分;

参考答案:C

题目解析:C语言程序总是从 main()函数开始执行.B中要调用的函数不一定在main()函数中定义。D main()函数可以放在程序的结尾部分;

3.以下程序运行后的输出结果是 ()
#include "stdio.h"
int f(int x);
main()
{
int n=1,m;
m=f(f(f(n)));
printf("%dn",m);  
}
int f(int x)
{return x*2;}

A、1;  B、2;  C、4;  D、8

参考答案:D

题目解析:主函数调用f(int x)函数,分解为:f(1)=2,f(2)=4,f(4)=8;

4.以下程序的输出结果是 ()
#include "stdio.h"
int fun(int m);
main()
{
int w=5;
fun(w);  
}
int fun(int m)
{
if(m>0)fun(m-1);
printf("%d ",m);
return 0;
}

A、5 4 3 2 1;

B、0 1 2 3 4 5;

C、1 2 3 4 5;

D、5 4 3 2 1 0;

参考答案:B

题目解析:第一个循环当m=5>0,执行fun(5-1)即fun(4)一直循环到m=0时结束循环开始回调,输出 0 1 2 3 4 5

5.以下程序执行后变量 w的值是()
#include "stdio.h"
int fun1(double a)
{
return a*=a;
}
int fun2(double x,double y)
{  double a=0,b=0;
   a=fun1(x);b=fun1(y);
   return(int)(a+b);  }
 main()
{  double w;
   w=fun2(1.1,2.0);
 }

A、5.21;

B、5;

C、5.0;

D、0.0;

参考答案:C

题目解析:在funl()函数中只有一条return语句,返回的是表达式a*=a的值,该值等于a*a。但是,由于fun1()函数的返回值类型被定义为int,所以返回值被取整,即fun1()函数实现的是求一个双精度数平方的整数部分。在fun2()函数中,分别对两个参数调用funl()函数,然后将两个返回值相加、取整后返回。所以,程序执行后,w中的值是[1.12]+[2.02]=1+4=5(中括号代表截尾取整)。又因为w被定义为double型,所以变量w中的值应该为一个双精度值5.0。

6.以下程序的输出结果是 ()
#include
int a,b;
void fun()
{ a=100; b=200; }
void main()
{ int a=5,b=7;
 fun();
 printf("%d%dn",a,b);
}

A、100200;

B、57;

C、200100;

D、75;

参考答案:B

题目解析:函数的a=100,b=200,不能传给实参。所以a和b的值在主函数中不变。

7.以下函数func()的功能是:使具有n个元素的一维数组b的每个元素的值都增加2,划线
处应填入()
func(int b[ ],int n)
{ int ;
for(i=0;i __________; }

A、b[i++];

B、b[i]++;

C、b[i+=2];

D、b[i]+=2;

参考答案:D

题目解析:A中下标+1不能实现每个元素+1。B中是每个元素+1。C和A一样错误。

8.如果在下面的程序中调用该函数,则输出结果是()
#include
int f(int a)
{ int b=0,c;
c=3;
b++ ; c++;
return (a+b+c); }
main()
{ int i;
for(i=0;i<3;i++)
printf("%d ",f(i)); }

A、5 7 9;

B、5 6 7;

C、3 4 5;

D、3 3 3;

参考答案:B

题目解析:for循环里面:f(0)=5,f(1)=6,f(2)=7;

第八章 指针

1.变量的指针,其含义是指该变量的地址;

2.运算符“ *”可以是单目运算符也可以双目运算符。

3.取地址运算符“&”与指针运算符“ *”的优先级相同,结合方向为自右向左。

4.指针变量的类型不是该变量本身的类型,而是它所指向的变量的类型。

5.指针变量可以作为函数的参数。

6.&b 指的是变量 b的地址,并非值。

7.int *p;定义了一个指针变量p,其存储的值是一个地址,在这个地址存储的值是整型的

1.若有定义语句: double a,*p=&a;以下叙述中错误的是()

A、定义语句中*是一个间接访问运算符;

B、定义语句中*号只是一个说明符;

C、定义语句中 p只能存放 double类型变量的地址;

D、定义语句中,*p=&a 把变量 a 的地址作为初始赋给指针变量 p;

参考答案:A

题目解析:*说明是double类型的指针,存放相应的地址.

2.若有语句 int *point,a=4; 和 point=&a; 下面均代表地址的一组选项是()

A、a,point,*&a;

B、&*a,&a,*point;

C、&point,*point,&a;

D、&a,&*point,point;

参考答案:D

题目解析:a是变量,point是指针,*point是值不是地址,&a是变量a的地址,&*a是变量a这个地址的内容,*&point和&*point一样的是地址
所以D正确

3.以下程序的运行结果是()
#include "stdio.h"
main()
{int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r;
printf("%d,%d,%d,%dn",m,n,*p,*q); }

A、1,2,1,2;

B、1,2,2,1;

C、2,1,2,1;

D、2,1,1,2;

参考答案:B

题目解析:*p=&m,开始时p指向m的地址,但是经过r=p;p=q;q=r;这一步完成了p和q交换,p指向的地址变成了2,而q指向的地址变成了1。所以输出值为:1,2,2,1;

4.以下程序中调用 scanf函数给变量 a 输入数值的方法是错误的,其错误原因是()
#include "stdio.h"
main()
{ int *p,q,a,b; p=&a; printf("input a: "); scnaf("%d",*p); ,}

A、*p 表示的是指针变量 p 的地址;

B、*p 表示的是变量 a的值,而不是变量 a 的地址;

C、*p 表示的是指针变量 p 的值;

D、*p 只能用来说明 p是一个指针变量;

参考答案:B

题目解析:B中因为p是一个指针,保存的是a的地址,也就是&a。要给a赋值就是写成 scanf(“%d”,&a);所以应该写成scanf(“%d”,p);

5.下面能正确进行字符串赋值 *** 作的是()

A、char s[5]={"ABCDE"};

B、char s[5]={'A','B','C','D','E'};

C、char *s; s="ABCDE";

D、char *s; scnaf("%s",&s);

参考答案:C

题目解析:A明显错误,B是一个合法的“字符数组”初始化语句,但是不是一个正确的“字符串”赋值语句,因为字符串要求最后有字符串结束标志''.D中s也是一个野指针,它指向的内存空间是随机的,不是一块合法的内存空间。用scanf("%s", &s);就是往一块不合法的内存空间里写入内容。

6.以下语句或语句组中,能正确进行字符串赋值的是()

A、char *sp;*sp="right";

B、char s[10];s="right";

C、char s[10];*s="right";

D、char *sp="right";

参考答案:D

题目解析:A错误,因为"right"是返回指向字符型的指针常量,*sp只能赋值给一个字符类型。B和C都是错误的,原因都在于:数组名是一个常指针,定义后给数组分配了内存,不能对数组名再赋值使之指向别的内存.但是可以定义是初始化:char s[10]=“right!”或char s[]=“right!”;

7.设有定义:char *c; ,以下选项中能够使字符型指针c正确指向一个字符串的是()

A、char str[]="string" ;c=str;

B、scanf("%s",c);

C、c=getchar();

D、char str[]=″string″;strcpy(″c,str″);

参考答案:A

题目解析:在选项B中,指针c没有正确初始化,指向的地址是未知的,因此不能在scanf函数中使用;在选项C中,getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回一1,且将用户输入的字符回显到屏幕,如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取,即c只能指向一个字符而不能指向字符串;在选项D中,strcpy函数用于字符串拷贝,函数有两个参数,因此strcpy(″c,str″)书写错误,所以选项D是错误的。

8.下列语句中,正确的是()

A、char *s;s="Olympic";

B、char s[7];s="Olympic";

C、char *s;s={"Olympic"};

D、char s[7];s={"Olympic"};

参考答案:A

题目解析:B、这里是数组,数值要么定义时出示化(char s1[7]="Olympic";这里7太小,应该大于字符串长度或者不写长度),要么单个元素初始化,要么内存拷贝.这里把数组的指向了一个静态区的地址,所以错误。C、不需要花括号。D、错误很明显

9.已有定义 int k=2; int *p1,*p2; 且 p1和 p2均已指向变量 k,下面不能正确执行的赋值语句是()

A、k=*p1+*p2;

B、p2=k;

C、p1=p2;

D、k=*p1*(*p2);

参考答案:B

题目解析:P1 P2是指针,K是整型变量,变量不能赋值给指针。

10.若有定义:double a[10],*s=a; ,以下能够代表数组元素 a[3] 的是()

A、(*s)[3];

B、*(s+3);

C、*s[3];

D、*s+3 ;

参考答案:B

题目解析:s指向第一个元素,s+3等于下标为3,解引用得a[3]

11.若有定义 int a[5],*p=a; ,则对 a 数组元素的正确引用是()

A、*&a[5];

B、a+2;

C、*(p+5);

D、*(a+2);

参考答案:D

题目解析:AC超出数组范围 ,B是地址。

12.若有定义语句: double a,*p=&a;以下叙述中错误的是()

A、定义语句中*是一个间接访问运算符;

B、定义语句中*号只是一个说明符;

C、定义语句中 p只能存放 double类型变量的地址;

D、定义语句中,*p=&a 把变量 a 的地址作为初始赋给指针变量 p;

参考答案:A

题目解析:*说明是double类型的指针,存放相应的地址.

13.若有程序段:char str[]="china";char *p;p=str; 则*p是字符指针变量,str首地址赋值给p,所以*p 与 str[0] 相等;

14.若有语句 int *point,a=4; 和 point=&a; 下面均代表地址的一组选项是()

A、a,point,*&a;

B、&*a,&a,*point;

C、&point,*point,&a;

D、&a,&*point,point;

参考答案:D

题目解析:a是变量,point是指针,*point是值不是地址,&a是变量a的地址,&*a是变量a这个地址的内容,*&point和&*point一样的是地址
所以D正确

15.以下选项中,对指针变量 p 的正确 *** 作是()

A、int a[5],*p; p=&a;

B、int a[5],*p; p=a;

C、int a[5]; int *p=a=1000;

D、int a[5]; int *p1,*p2=a; *p1=*p;

参考答案:B

题目解析:A中因为p存放的是内存的地址,&a表示的是地址的地址,C中因为数组a表示的是常量地址,常量地址是不能赋值的d。D错在*p2=a,*p2表示的是内存地址中的值,而a是常量地址,类型不匹配

16.设有定义语句:int m[]={2,4,6,8},*k=m; ,以下选项中表达式的值为 6 的是()

A、*(k+2);

B、k+2;

C、*k+2;

D、*k+=2;

参考答案:A

题目解析:*(k+2)相当于m[2],m[2]等于6;

17.若有定义:int *p,m=5,n; ,以下正确的程序段是()

A、p=&n;scanf("%d",&p);

B、p=&n;scanf("%d",*p);

C、scanf("%d",&n); *p=n;

D、p=&n;*p=m;

参考答案:D

题目解析:A错在*p = n, 因为p指向的空间为NULL,直接赋值n,会出错
B错在scanf,因为是使用的是地址,应该是scanf("%d",p);
Cp=&n;scanf("%d",&p);同上,应该是scanf("%d",p);

18.若有定义语句:int a[4][10],*p,*q[4] ;且 0≤i <4,则错误的赋值是()

A、p=a;

B、q[i]=a[i];

C、p=a[i];

D、p=&a[2][1];

参考答案:A

题目解析:A中a[][]相当于 **a。p是指针;a是指向指针的指针,两个无法赋值

19.若有定义 char s[10]; ,则在下面表达式中不表示 s[1] 的地址的是()

A、s+1;

B、s++;

C、&s[0]+1;

D、&s[1];

参考答案:B

题目解析:A s为s[0]地址,s+1即s[1]地址。B s++,自加后,s为s[1]地址,但后置自加是先取值,再自加所以 这里表达式的值是s[0]地址。 选B。C 和A类似 &s[0]即s。D &s[1] 标准的写法,s[1]的地址。

20.程序段 char *s="abcde"; s+=2; printf("%d",s); 的运行结果是()

A、cde;

B、字符'c';

C、字符'c' 的地址;

D、无确定的输出结果;

参考答案:C

题目解析:在开始的时候s的值是字符串的地址,也就是首字符‘a’的地址,c+2之后,它会将指向字符‘c’因为s是指向字符的指针,所以每加一指针会移动一个字符所占用空间的大小

21.下面程序段的运行结果是()
char str[]="ABC", *p=str; printf("%dn",*(p+3));

A、67;  B、0 ;  C、字符'C' 的地址;   D、字符'C';

参考答案:B

题目解析:*(p+3) 表示 p 的地址从开始处移动3

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5699097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存