更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

C语言20道题目,帮你总结C语言零碎知识点

  • 发布:C++培训
  • 来源:学习笔记
  • 时间:2017-06-09 16:54

C语言有很多零碎的知识点,让人难以把握。这里总结了20道比较容易错的C语言的题目,主要是关于循环、数组、指针。

1.

char a[7]="abcdef"; char b[4]="ABC";
strcpy(a,b); 
printf("%c",a[4]);
程序运行的结果是( )

 

Solution:

Strcpy(a,b):把从b地址开始且含有'\0'结束符的字符串复制到以a开始的地址空间。故按题目可知strcpy后a字符串的内容为“ABC\0ef\0”

 

答案:e

2. 

下面程序段的运行结果是( )
char c[]="\t\v\\\0will\n";
printf("%d",strlen(c));

 

Solution:

转义字符如图所示:\t \v \\ \0 \n都是转义字符

 

strlen函数:strlen(a)是从a地址开始读取字符直到读到\0停止,得到这一段区间内有效字符个数。所以strlen只读取了\t\v\\\0这一段内容

 

答案:3

 

3. 

以下能对二维数组a进行正确赋初值的语句是( )

C) int a[2][4]={{1,2,3},{4,5},{6}};

D) int a[ ][2]={{1,0,1},{ },{1,1}};

B) int a[ ][3]={{1,2,3},{4,5,6}};

A) int a[2][ ]={{1,0,1},{5,2,3}};

 

Solution:

二维数组赋初值时,如果提供了全部元素的数据或者分行赋初值时,可以省略第一维的长度,但不管怎么样第二维长度是不能省略的。

如int a[][4]={{0,0,3},{},{0,10}} 可知该数组有3行,省略部分数组元素值为0

 

答案:B

 

4. 

有以下的定义:int t[3][2];能正确表示t数组元素地址的表达式是()。

C)&t[1]

D) t[2]

B) t[3]

A) &t[3][2];

 

Solution:

&t[1]表示1行首地址;t[1]表示t[1][0]地址,t[2]表示t[2][0]地址;t[3]、&t[3][2]越界了

补充:t[1]+1:t[1][1]地址;*(t+1)等价于t[1]表示t[1][0]地址;*t与t[0]表示t[0][0]地址而t表示0行首地址

Conclusion:

表示元素地址:*t、t[0]、t[1]、*(t+1)、t[1]+2、*(t+1)+2

表示某行地址:t、t+1、&t[1]

 

答案:D

 

5.

以下程序段的输出结果是()

char *alp[ ]={"ABC","DEF","GHI"};

int j;

puts(alp[1]);

  B) B

A) A

C) D

D) DEF

 

Solution:

char*alp[]={"ABC","DEF","GHi"};  这句话是定义了一个char型的指针数组,三个指针alp[0]、alp[1]、alp[2]分别指向"ABC","DEF","GHi";指针数组的知识详见课本。

 

答案:D

 

6. 

已知:char b[5],*p=b;则正确的赋值语句是( )

 B)*b=”abcd”;

C)p=”abcd”;

D)*p=”abcd”;

A)b=”abcd”;

 

Solution:

b是数组名,为b[5]数组的首地址,也是b[0]的地址,属于常量,在内存里是固定不变的,不能对常量赋值。而p是指针变量,可以赋值。p=”abcd”;表示将p指向”abcd”的首地址。

*b表示b[0]的值。*b\*p表示b[0],占一个字节,故不能将字符串赋值给p,若是*p='a',则正确。

 

答案:C

 

7. 

已知:int a[3][4],*p=&a[0][0];p+=6;那么*p和( )的值相同.

C) *(a[2]+1)

B) *(&a[0]+6)

A) *(a+6)

D) a[1][2]

 

Solution:

由于p指针为数组元素的地址,则p+1中1意味着1个元素的字节长,故p=p+6,相当于a数组中第六个元素的地址(按行看),第0行3个,第1行的第3个,即a[1][2]

若改成int a[3][4],*p=a;p+=2;则p+1中1意味着1行的字节长,p=p+2→p=&a[2],则*p的值为第2行整个字符串的值,而不是a[2][0]的值。

 

答案:D

 

8. 

已知:char c[8]=”Beijing”,*s=c;int I;则下面的输出语句中,错误的是( )

B)printf(”%s\n”,*s);

C)for (i=0;i<7;i++) printf(”%c”,c[i]);

A)printf(”%s\n”,s);

D)for (i=0;i<7;i++) printf(”%c”,s[i]);

 

Solution:

输出字符串可以有两种方式:1)循环语句,一次输出一个数组元素; 2)printf(”%s\n”,数组名);在这里指针s与数组名c等价。

 

答案:B

 

9. 

已知:char *aa[2]={”abcd”,”ABCD”};则以下说法正确的是()

B)aa是指针变量,它指向含有两个数组元素的字符型一维数组

A)aa数组元素的值分别是”abcd”和”ABCD”

D) aa数组的两个元素中各自存放了字符”a”和”A”的地址

C)aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址

 

Solution:

*aa[2]为指针数组,其元素aa[0]、aa[1]的值为指针→地址。

aa[0]、aa[1]分别指向“abcd”、“ABCD”字符数组,两个数组含有5个字符噢!。

 

答案:D

 

10.

已知:int a[ ]={1,2,3,4},y,int *p=&a[1];则执行语句”y=(*--p)++;之后,变量y的值为( )

D)4

A)1

B)2

C)3

 

Solution:

*--p:是p自减1后,做*运算,即p=p-1;*p. *p++:p++意思是先使用p再让p的值加1,所以先取*p,再让p=p+1.

--p:p=&a[0]→*p=a[0]→*p++:*p=a[0],p=&a[1]

 

答案:A

 

11. 

main函数通过对函数abcd来交换main中的两个变量的值。则(?)内应填写的语句正确的选项是( )

#include

main(){

float x=10,y=20;

abcd (&x,&y);

printf(”%f,%f\n”,x,y); }

void abcd(float *x,float *y)

{ float temp; ( ? )}

B) temp=*x;*x=*y;*y=temp;

C) *temp=*x;*x=*y;*y=*temp;  

D) *temp=y;y=x;x=*temp;

A) temp=x;x=y;y=temp;

 

Solution:

在主函数中,将实参&x,&y传递给了形参float *x,float *y,使得形参x,y两个指针变量分别等于主函数中实参x、y的地址,也就是形参x、y指针,指向了实参x、y。

在abcd函数中,因为形参指针x、y指向实参x、y,因此通过改变*x、*y(即指针所指向变量的值)来改变实参x、y的值,即temp=*x;*x=*y;*y=temp

 

注意不能企图通过改变指针形参的值而使指针实参的值发生改变,因为函数调用是单向值传递。D选项便是使指针形参x、y的值发生交换,但只是使得形参x、y指向的地址发生交换而已,在主函数中,实参x、y并未发生任何改变。

 

答案:B

 

 

12. 

以下不构成无限循环的语句或语句组是( )

B) n=0; while(1){n++;}

C) n=10; while(n){n--;}

D) for(n=0,i=1; ;i++)n+=i;

A) n=0; do {++n;}while(n>0);

 

Solution:

在C语言中,0代表假,其他非0数代表1→真

while(0)意味着条件永远为假,停止循环;while(1)\while(-1000)\while(9)都等于while(1),意味着条件永远为真,执行循环

while(a=14)等价于while(a),即先执行赋值运算,再条件判断

 

答案:C

 

13.

下面程序的运行结果是( )

#include

main()

{ int i,b,k=0;

for (i=1;i<=5;i++)

{ b=i%2;

while ( b-->=0)k++;}

printf("%d,%d",k,b);}

C) 3,0

D) 8,-2

B) 8,-1

A) 3,-1

 

Solution:

此题容易忽略while循环,把其看成是do...while循环,故每次for循环执行了一次while语句。

流程:第一次for循环→while循环,直到b--<0,才停止while循环→第二次for循环→....

while ( b-->=0):先判断b>0是否成立,再使b的值自减1.不管b>0是否成立,b都会执行自减1的操作。故在第五次for循环(i=5)时,b=1后进入while循环:b=1>=0;b=b-1=0;k++→b=0>=0;b=b-1=-1;k++→b=-1<=0停止循环,但注意此时仍会执行b--操作,故b=b-1=-2

 

答案:D

 

SIMILAR:

下面程序的运行结果是()

# include

main()

{ int i,j,x=0;

for (i=0;i<2;i++)

{ x++;

for(j=0;j<=3;j++)

{ if (j%2) continue;/*把此for循环结束后才能执行下一步操作,不要只执行一次了*/

x++;}

x++;}

printf ("x=%d\n",x);}

 

答案:x=8

 

14.

下面程序的运行结果是()

#include

main()

{ int a,y; a=10;y=0;

do {

a+=2;y+=a;

if(y>50) break; }

while(a=14);

printf("a=%d y=%d\n",a,y);}

 

Solution:

易错点是每次判断while(a=14)都是在给a赋值,即每次循环开始时a=14.

 

答案:a=16,y=60

 

15. 以下能对一维数组a进行正确初始化的形式是()

D) int a[10]={10*1 };

C) int a[ ]={0};

A)int a[10]=(0,0,0,0,0);

B) int a[10]={ };

 

Solution:

数组赋初值,可以省略数组元素的个数,但此时必须使用{}声明内容(非圆括号,如A)。

int a[10]={ }也是不正确的,只有给出部分元素时,其余才默认为0。当然也可不赋予初值:

int a[10]

 

答案:C

 

16. 

若有说明:int a[10];,则对a数组元素的正确引用是()

D) a[10-10]

B) a[3.5]

C) a(5)

A) a[10]

 

NOTICE:

对数组元素的引用最容易错的在于“溢出”,即int a[n]时,元素a[n]是不存在的,最多为a[n-1]

数组元素a[i]中,i是可以为数学表达式,只要范围在0~n-1之间。

 

答案:D

 

17. 

下面程序段的运行结果是()

char c[5]={'a','b','\0','c','\0'};

printf("%s",c);

 

B) ab

A) 'a''b'

D) ab空格

C) ab空格c

 

Solution:

printf对字符串的输出:是从数组首地址开始,读取到’\0’为止。

 

答案:B

 

18. 

下面是对数组s的初始化,其中错误的是()

B) char s[5]={'a','b','c'};

D) char s[5]="abcde";

A) char s[5]={"abc"};

C) char s[5]=" ";

 

Solution:

有两种对字符数组初始化的方式:

1) char s[5]="abcd"; 在这种情况下字符数组其默认最后一个元素为’\0’,故定义字符数组int a[n]时,能赋初值的元素为n-1个

2) char s[5]={'a','b','c',’d’,’e’};这样写是合法的。改成char s[]={'a','b','c',’d’,’e’}时字符串长度也为5

Eg:

Char c[]=’’I am happy’’等价于Char c[]={‘I’,’ ‘,’a’,’m’,’h’,’a’,’p’,’p’,’y’,’\0’} ——字符串长度11

But不等价于Char c[]={‘I’,’ ‘,’a’,’m’,’h’,’a’,’p’,’p’,’y’}——字符串长度10

 

这里Sybil有个疑问,望读者不吝赐教(欢迎评论~)

char s[5]=" "为什么是对的; 而15题int a[10]={ }是错的

 

答案:D

 

19. 

若有以下语句,则正确的描述是( )

char x[ ]="12345";

char y[ ]={'1','2','3','4','5'};

 

D) x数组等价于y数组

A) x数组和y数组的长度相同

B) x数组长度大于y数组长度

C) x数组长度小于y数组长度

 

Solution:

由上题可知,x数组长度为6,y数组长度为5

 

答案:B

 

20. 若有以下程序段:

int a[ ]={4,0,2,3,1},i,j,t;

for (i=1;i<5;i++)

{ t=a[i];j=i-1;

while (j>=0&&t>a[j])

{ a[j+1]=a[j];j--; }

a[j+1]=t;}

 

C) 对数组a进行选择排序(升序)

B) 对数组a进行插入排序(降序)

D)对数组a进行选择排序(降序)

A) 对数组a进行插入排序(升序)

 

Solution:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到插入排序法。

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

 

答案:B

 

21.下面描述错误的是()

C) 字符数组中只能存放键盘上可以找到的字符

A) 字符数组中可以存放ASCⅡ字符集中的任何字符

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

B) 字符数组的字符串可以整体输入、输出

 

Solution:

ASCII码表上许多符号都不能在键盘上打出来,但可以通过赋予字符数组ASCII码表值来实现。如char c=32(32为空格。

字符串整体输入用gets、scanf,整体输出用printf(“%s”,数组名)

 

答案:C

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:10个C语言小程序,值得收藏经典的C语言小程序
下一篇:4个C语言学习的难点,学会这些才算真正搞懂C语言

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省