第六章
1.一維數(shù)組的定義和引用
- 定義一維數(shù)組
int a[10]
表示定義了一個(gè)整形數(shù)組娇妓,數(shù)組名為a缀壤,此數(shù)組有10個(gè)整型元素成榜。定義一維數(shù)組的一般形式為 ==類型符 數(shù)組名[常量表達(dá)式]==
-
[注意]
定義數(shù)組時(shí)蚌卤,方括號中的常量表達(dá)式用來表示元素的個(gè)數(shù)筐付,即數(shù)組長度佑女。
C語言不允許對數(shù)組的大小做動(dòng)態(tài)定義记靡,即數(shù)組的大小不依賴于程序運(yùn)行過程中變量的值谈竿,以下定義為不合法:
int n; scanf("%d", &n); int a[n];
如果在被調(diào)用的函數(shù)(不包括主函數(shù))中定義數(shù)組,其長度可以是變量或非常量表達(dá)式摸吠,在調(diào)用func函數(shù)式形參n從實(shí)參得到值空凸。這種情況被稱為“可變長數(shù)組”,允許在每次調(diào)用func函數(shù)時(shí)寸痢,n有不同的值呀洲。但是在執(zhí)行函數(shù)時(shí),n的值是不變的啼止,數(shù)組長度是固定的道逗。
void func(int n){ int a[2*n]; ... }
如果指定數(shù)組為靜態(tài)(static)存儲(chǔ)方式,則不能用“可變長數(shù)組”献烦。如
static int a[2*n]; //不合法滓窍,a數(shù)組指定為static存儲(chǔ)方式
- 引用一維數(shù)組
引用數(shù)組元素的表示形式為 ==數(shù)組名[下標(biāo)]==
a[0] = a[5] + a[7] + a[2*3];
-
[注意]
定義數(shù)組時(shí)用到的 ==數(shù)組名[常量表達(dá)式]== 和 引用數(shù)組元素時(shí)用的 ==數(shù)組名[下標(biāo)]== 形式相同,但含義不同巩那。例如:
int a[10]; //這里的a[10]表示定義數(shù)組時(shí)指定數(shù)組包含10個(gè)元素 t = a[6]; //這里的a[6]表示引用a數(shù)組中序號為6的元素
- 初始化
在定義數(shù)組時(shí)對全部數(shù)組元素賦予初值吏夯。
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
只給一部分元素賦值,未賦值部分自動(dòng)設(shè)為0
int a[10] = {0, 1, 2, 3, 4}; // 部分賦值
對全部數(shù)組元素賦初值時(shí)即横,由于個(gè)數(shù)已經(jīng)確定噪生,所以可以不指定數(shù)組長度。
int a[] = {0, 1, 2, 3, 4};
2.二維數(shù)組的定義和引用
- 定義二維數(shù)組
一般形式為 ==類型符 數(shù)組名[常量表達(dá)式][常量表達(dá)式]==东囚;
float a[3][6]; //第一維有3個(gè)元素跺嗽,第二維有6個(gè)元素,分別用方括號括起來页藻,即a為3x4(3行4列)的數(shù)組;
float a[3,4][5,10]; //不合法抛蚁,一個(gè)方括號不能寫兩個(gè)下標(biāo);
-引用二維數(shù)組
二維數(shù)組的表示形式為 ==數(shù)組名[下標(biāo)][下標(biāo)]==
a[2][3]; //表示a數(shù)組中序號為2的行中序號為3的列的元素惕橙,下標(biāo)應(yīng)該是單個(gè)整型表達(dá)式瞧甩。
-初始化二維數(shù)組
分行給二維數(shù)組賦初值
int a[3][4] = {{1, 2,3, 4}, {1, 2,3, 4}, {1, 2,3, 4}};
int a[][4] = {{1, 2,3, 4}, {1, 2,3, 4}, {1, 2,3, 4}};//與上式效果相同
所有數(shù)據(jù)都寫在花括號內(nèi),按順序分配
int a[3][4] = {1, 2,3, 4, 1, 2,3, 4, 1, 2,3, 4};
int a[][4] = {1, 2,3, 4, 1, 2,3, 4, 1, 2,3, 4}; //與上式效果相同
對部分賦值
int a[3][4] = {{1}, {1}, {1}};
結(jié)果:
1 0 0 0
1 0 0 0
1 0 0 0
int a[3][4] = {{1}, {0, 1}, {0, 0, 1}}; //沒有賦值的部分自動(dòng)為0
結(jié)果:
1 0 0 0
0 1 0 0
0 0 1 0
int a[3][4] = {{1}, {}, {0, 0, 1}}; //第二行自動(dòng)為0
結(jié)果:
1 0 0 0
0 0 0 0
0 0 1 0
3.字符數(shù)組
- 定義字符數(shù)組
用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組弥鹦。字符數(shù)組中的一個(gè)元素存放一個(gè)字符肚逸。
char c[10]; //類似數(shù)值型數(shù)組
-初始化
初始化列表,列表中的初值個(gè)數(shù)不能大于數(shù)組長度彬坏,少于則自動(dòng)定義為空字符(即'\0')朦促。
char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y'};
char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y', '!'}; //不合法,超出數(shù)組長度會(huì)報(bào)錯(cuò)
char c[10] = {'I', '', 'a', 'm', '', 's', 'a', 'd'}; // c[8]=c[9]='\0'栓始, 結(jié)果:I am sad\0\0
- 引用字符數(shù)組
引用一個(gè)元素得到一個(gè)字符
# include <stdio.h>
int main()
{
char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]务冕、c[4]中的單引號內(nèi)有空格;
int i;
for(i=0; i<10; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
運(yùn)行結(jié)果:
I am happy.
- 關(guān)于字符串和字符串的結(jié)束標(biāo)志
使用字符串常量對字符數(shù)組進(jìn)行初始化
char c[] = {"I am happy."}; //將單撇號變?yōu)殡p撇號表示字符串
char c[] = "I am happy."; //效果同上
實(shí)際工作中幻赚,人們關(guān)心的往往是字符串的有效長度而不是字符數(shù)組的長度禀忆。為了測試字符串的實(shí)際長度臊旭,C語言規(guī)定了一個(gè)“字符串結(jié)束標(biāo)志”,以字符‘\0’作為結(jié)束標(biāo)志箩退。也就是說在數(shù)組中遇到字符‘\0’离熏,表示字符串結(jié)束,把它前面的字符組成一個(gè)字符串戴涝。系統(tǒng)在處理字符串常量存儲(chǔ)時(shí)會(huì)自動(dòng)加一個(gè)‘\0’滋戳。
char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y'};
輸出:happyram
char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y', '\0'}; //手動(dòng)加一個(gè)‘\0’,新舊字符就不會(huì)連在一起
輸出:happy
- 字符數(shù)組的輸入輸出
逐個(gè)字符輸入輸出啥刻,使用格式符‘%c’奸鸯;
# include <stdio.h>
int main()
{
char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]、c[4]中的單引號內(nèi)有空格可帽;
int i;
for(i=0; i<10; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
運(yùn)行結(jié)果:
I am happy.
將整個(gè)字符串一次輸入或輸出府喳,使用格式符‘%s’;
char c[] = {"China"};
printf("%s",c); //printf函數(shù)中的輸出項(xiàng)是字符數(shù)組名蘑拯,而不是數(shù)組元素名
運(yùn)行結(jié)果:
China
-
[拓展]
可以使用scanf函數(shù)輸入一個(gè)字符串
char c[]; scanf("%s", c); //c必須是已定義的字符數(shù)組名; char str1[],str2[],str3[]; scanf("%s%s%s", str1, str2, str3); //輸入時(shí)應(yīng)以空格分隔字符串兜粘;
scanf函數(shù)中的輸入項(xiàng)如果是字符數(shù)組名申窘,不要再加地址符‘&’,因?yàn)镃語言中的數(shù)組名代表該數(shù)組的起始地址
printf("%o",c); //“%o”格式符可根據(jù)數(shù)組名輸出數(shù)組的起始地址孔轴; printf("%s",c); //按字符數(shù)組名c找到其數(shù)組起始地址剃法,然后逐個(gè)輸出其中的字符,直到遇到‘\0’為止路鹰;
-字符串處理函數(shù)
-
puts函數(shù)——輸出字符串的函數(shù)。
char str[] = "China\nBeijing"; puts(str);//可以包括換行符 運(yùn)行結(jié)果: China Beijing
gets函數(shù)——輸入字符串的函數(shù)
gerts(str);
。
- [puts和gets函數(shù)只能輸出或輸入一個(gè)字符串羹呵,不能寫成puts(str1,str2)]
-
strcat函數(shù)——字符串連接函數(shù)
strcat(str1, str2)
琢融。char str1[30] = {"People's Republic of"}; char str2[] = {"China."}; printf("%s", strcat(str1, str2)); 運(yùn)行結(jié)果: People's Republic of China.
-
strcpy和strncoy——字符串復(fù)制函數(shù)
strcpy(str1, str2)
。strcpy將str2復(fù)制到str1中去
char str1[10], str2[]="China"; strcpy(str1, str2); 運(yùn)行結(jié)果: China\0\0\0\0\0;
strncpy將str2最前面的n個(gè)字符復(fù)制到str1中雁竞,取代str1中原有的最前面n個(gè)字符钦椭。
strncpy(str1, str2, n);
-
strcmp函數(shù)——字符串比較函數(shù)
strcmp(str1, str2);
將兩個(gè)字符串自左至右逐個(gè)字符相比(按ASCII碼值大小比較),知道出現(xiàn)不同的字符或遇到‘\0’為止碑诉。若出現(xiàn)不同的字符彪腔,則以第一對不相同的字符比較結(jié)果為準(zhǔn),位置在后面為大进栽。
- str1==str2德挣,返回0;
- str1>str2快毛,返回一個(gè)正整數(shù)格嗅;
- str1<str2番挺,返回一個(gè)負(fù)整數(shù);
if(strcmp(str1,str2)>0); printf("yes");
-
strlen——測字符串長度的函數(shù)吗浩,指實(shí)際長度建芙,不包括‘\0’。
char str[10] = "China"; printf("%d", strlen(str)); 運(yùn)行結(jié)果: 5
strlwr——轉(zhuǎn)換為小寫的函數(shù)懂扼。
strlwr(str)
strupr——轉(zhuǎn)換為大寫的函數(shù)禁荸。
strupr(str)