全国二级C知识点总结3-数组

  • 2019 年 11 月 21 日
  • 筆記

本课重要知识点:

1.知识点:一维数组的定义

例1:(2010-03-25)下列选项中,能正确定义数组的语句是(D)

A)int num[0…2008]; B)int num[];

C)int N=2008; D)#define N 2008

int num[N]; int num[N];

【解析】数组的长度必须是一个整型常量、整型常量表达式,故A项错误。定义数组时,不能省略数组长度,B项错误。数组的长度不能是变量,C项错误。数组的长度可以是符号常量,D项正确。

例2:(2010-09-28)若要定义一个具有5个元素的整型数组,以下错误的定义语句是(D)

A)int a[5]={0}; B)int b[]={0,0,0,0,0};

C)int c[2+3]; D)int i=5,d[i];

【解析】可以只给数组的前面一部分元素设定初值,A项正确。对全部数组元素赋初值时,可以不指定数组元素的个数,B项正确。数组的长度可以是一个整型常量表达式,C项正确。数组的长度不能是变量,D项错误。

2.知识点:一维数组元素的引用

例1:(2008-09-21)若有定义语句:int m[]={5,4,3,2,1},i=4;则下面对m数组元素的引用中错误的是 (C)

A)m[–i] B)m[2*2] C)m[m[0]] D)m[m[i]]

【解析】m数组元素的引用的下限为0,上限为4。i=4,–i的值为3,A项正确。B项没有越界,正确。m[0]=5,超过上限,已经越界,故C项错误。m[4]=1,没有越界,故D项正确。

例2:(2011-03)以下程序运行后的输出结果是 13715

main()

{ int i,n[5]={0};

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

{ n[i]==n[i-1]*2+1; printf("%d",n[i]); }

printf("n");

}

【解析】:n[1]=1,n[2]=1*2+1=3,n[3]=3*2+1=7,n[4]=7*2+1=15

3.知识点:一维数组的初始化

l 顺序列出数组元素的全部初值,例如inta[5]={1,2,3,4,5};

l 只给数组的前面一部分元素设定初值,未赋初值的元素自动取0值。例如,int a[5]={1,2};

l 对全部数组元素赋初值时,可以不指定数组元素的个数。例如,inta[]={1,2,3,4,5};

4.知识点:二维数组的初始化

l 按行分段给二维数组赋初值

l 按行连续赋值

l 对部分元素赋初值,未赋初值的元素自动取0值

l 若对全部元素赋初值,则第一维的长度可以不指定

例1:(2006-04-16)以下数组定义中错误的是(B)

A) int x[][3]={0};

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

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

D) int x[2][3]={1,2,3,4,5,6};

【解析】若对全部元素赋初值,则第一维的长度可以不指定,C项正确。二维数组的初始化可以按行连续赋值,D项正确。C项二维数组的初始化超过第一维度长度,故错误。

5.知识点:二维数组和for语句

例1:(2010-03-09)有以下程序

#include <stdio.h>

main()

{int i,j,a[][3]={1,2,3,4,5,6,7,8,9};

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

for(j=i;j<3;j++) printf(“%d”,a[i][j]);

printf(“n”);

}程序运行后的输出结果是 123569

6.知识点:字符串

定义:由“”引起来的,由若干个字符所组成的序列。

字符串的结束标志:’’

如字符串“china”,在内存中存储形式是

c

h

i

n

a

该字符串的长度为5字节,所占的存储空间为6字节。

7.知识点:字符数组的定义及初始化

l 字符数组名是地址常量,不能赋值给数组名。

例1:(2009-04-32)以下选项中正确的语句组是(D)

A)char s[];s=”BOOK!”; B)char *s;s={“BOOK!”};

C)char s[10];s=”BOOK!”; D)char *s;s=”BOOK!”;

【解析】字符数组名是地址常量,不能赋值给数组名,故A、C项错误,D项指针s是个变量,将字符串常量赋值给s,是正确的。B项中给s赋值时不能用花括号将字符串括起来。

例2:(2009-09-31)下面是有关C语言字符数组的描述,其中错误的是(D)

A)不可以用赋值语句给字符数组名赋字符串

B)可以用输入语句把字符串整体输入给字符数组

C)字符数组中的内容不一定是字符串

D)字符数组只能存放字符串

8.知识点:字符数组的输入与输出

例1:(2009-09-13)有以下程序

#include <stdio.h>

main()

{char a[20]=”How are you?”,b[20];

scanf(“%s”,b);printf(“%s %sn”,a,b);

}程序运行时从键盘输入:Howare you?<回车>

则输出结果为How are you? How

【解析】scanf函数输入,以空格作为字符串输入结束的标志,故字符数组b只接收到字符串”How”。

例2:(2011-03)有以下程序

main()

{ char a[30],b[30];

scanf("%s",a);

gets(b);

printf("%sn%sn",a,b);

}程序运行时若输入:howare you? I am fine<回车>则输出结果是(B)

A)how are you? B)how

I amfine are you?I am fine

C)how are you? I am fine D)row are you?

【解析】:scanf以空格作为字符串输入结束的标志,而gets(s)不会。所以a得到的是“how”,b得到的是剩下的“are you? I am fine”。故选择B。

例3:(2011-03)有以下程序

main()

{ chars[]="012xy8s34f4w2";

inti, n=0;

for(i=0;s[i]!=0;i++)

if(s[i]>='0'&&s[i]<='9') n++;

printf("%dn",n);

}  程序运行后的输出结果是 (B)

A)0 B)3 C)7 D)8

【解析】:for循环读取字符数组s中的字符,当读到0时退出循环,注意0和‘0’的区别,字符‘0’的ASCII码为48,‘’的ASCII 码才是0,所以读取的字符为“012xy”中的字符,for循环读取到字符后判断是不是数字字符,如果是n自增1,“012xy”中的数字字符只有三个,所以选择B。

9.知识点:字符串处理函数

例1:(2011-09-32)有以下程序:

#include<stdio.h>

#include<string.h>

main()

{ chara[5][10]={“china”,”beijing”,”you”,”tiananmen”,”welcome”};

int i,j; char t[10];

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

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

if(strcmp(a[i],a[j])>0)

{ strcpy(t,a[i]); strcpy(a[i],a[j]); strcpy(a[i],t);}

puts(a[3]);

}程序运行后的输出结果是 (C)

A.beijing B.china C.welcome D.tiananmen

【解析】双层for循环部分是典型的排序方法,通过strcmp比较两个字符串的大小,然后借助t数组作为中转数组,通过strcpy函数完成a[i]和a[j]两个字符串的交换,使a数组按从小到大排序,即{”beijing” , “china” , ”tiananmen”,”welcome”,”you” }

例1:(2010-09-23)有以下程序

#include <stdio.h>

#include <string.h>

main()

{char x[]=”STRING”;

x[0]=0;x[1]=’’;x[2]=’0’;

printf(“%d %dn”,sizeof(x),strlen(x));

}程序运行后的输出结果是(B)

A)6 1 B)7 0 C)6 3 D)7 1

【解析】经过x[0]=0;x[1]=’’;x[2]=’0’;后,x[]=”00ING”。strlen测字符串的实际长度,不含字符串结束标志’’,故strlen(x)为0。sizeof测字符串所占的存储空间,包含字符串结束标志,故sizeof(x)为7。

例2:(2010-09-33)有以下程序

#include <stdio.h>

#include <string.h>

main()

{char a[20]=”ABCDEFG”,b[]=”IJK”;

strcat(a,b); printf(“%sn”,a);

}程序运行后的输出结果是(B)

A)ABCDEFGIJK B)ABCDIJK C)IJK D)EFGIJK

【解析】把字符数组b中的字符串连接到字符数组a中字符串的后面,并删去字符串a后的第一个字符串结束标志’’。故输出结果为ABCDIJK。

例3: (2010-09-31)下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST”要求的是 (A)

A)if(strcmp(s2,s1)==0)ST; B)if(s1==s2)ST;

C)if(strcpy(s1,s2)==1)ST; D)if(s1-s2==0)ST;

【解析】若字符串s1等于字符串s2,strcmp(s2,s1)==0,故答案是A。