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