­

全國二級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。