|
數(shù)組 定義:數(shù)組是有序的并且具有相同類型的數(shù)據(jù)的集合。 一維數(shù)組 1、一般形式:類型說(shuō)明符 數(shù)組名[常量表達(dá)式];例如: int a[10]; 元素為a[0]----a[9]. 2、常量表達(dá)式中不允許包含變量,可以包含常量或符號(hào)常量。 3、數(shù)組元素下標(biāo)可以是任何整型常量、整型變量或任何整型表達(dá)式。 4、可以對(duì)數(shù)組元素賦值,數(shù)組元素也可以參與運(yùn)算,與簡(jiǎn)單變量一樣使用。 5、使用數(shù)值型數(shù)組時(shí),不可以一次引用整個(gè)數(shù)組,只能逐個(gè)引用元素。 6、需要整體賦值時(shí)只可以在定義的同時(shí)整體賦值。如 int a[10]={0,1,2,3,4,5,6,7,8,9};正確。 int a[10]; a[10]={0,1,2,3,4,5,6,7,8,9};錯(cuò)誤。 或者用內(nèi)存拷貝函數(shù) 7、可以只給一部分元素賦值。例如: int a[10]={5,8,7,6};后面沒有賦值的元素值默認(rèn)為0。 8、對(duì)全部數(shù)組元素賦值時(shí)可以不指定數(shù)組長(zhǎng)度,例如: int a[10]={0,1,2,3,4,5,6,7,8,9};可以寫成 int a[]={0,1,2,3,4,5,6,7,8,9}; 但是,既不賦初值,也不指定長(zhǎng)度是錯(cuò)誤的。例如:int a[];錯(cuò)誤。 9、指向數(shù)組元素的指針 int a[10], *p; //下面這兩句是等價(jià)的: 二維數(shù)組 1、一般形式:類型說(shuō)明符 數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];例如: int a[3][4];可以看成是包含3個(gè)一維數(shù)組,每個(gè)一維數(shù)組里包含4個(gè)元素。一共3*4=12個(gè)元素。 所有元素為 a[0][0],a[0][1],a[0][2],a[0][3] a[1][0],a[1][1],a[1][2],a[1][3] a[2][0],a[2][1],a[2][2],a[2][3] ┏━━━━┓ ┏━┳━┳━┳━┓ a─→┃ a[0] ┃─→┃0 ┃1 ┃2 ┃3 ┃ a代表二維數(shù)組的首地址, 當(dāng)然也可看成是二維 數(shù)組第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。如 果此二維數(shù)組的首地址為1000, 由于第0行有4個(gè)整型元素, 所以a+1為1008, a+2 2、與一維數(shù)組一樣元素下標(biāo)可以是是任何整型常量、整型變量或任何整型表達(dá)式。 3、需要整體賦值時(shí)只可以在定義的同時(shí)整體賦值。例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};正確。 int a[3][4]; a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};錯(cuò)誤。 4、可以把所有數(shù)據(jù)寫在一個(gè)花括號(hào)內(nèi)。例如: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};正確。 5、可以只對(duì)部分元素賦值。例如: int a[3][4]={{1},{5},{9}};其余未賦值的元素默認(rèn)為0。 int a[3][4]={{1},{5,6}};可以看成是int a[3][4]={{1,0,0,0},{5,6,0,0},{0,0,0,0}}; 6、對(duì)全部數(shù)組元素賦值時(shí)可以省略第一維長(zhǎng)度,第二維不可以省略。例如: a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 可以寫成a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 或者a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 7、在二維數(shù)組中, 我們還可用指針的形式來(lái)表示各元素的地址。 a[0]與*(a+0)等價(jià), a[1]與*(a+1)等價(jià), 因此a[i]+j就與*(a+i)+j等價(jià), 它 因此, 二維數(shù)組元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j), 它們都與 字符數(shù)組 1、定義:char a[10];字符數(shù)組a長(zhǎng)度為10。每個(gè)元素只能存放一個(gè)字符。例如: a[0]='h';a[1]='a';a[2]='p';…… 2、初始化: char a[]={'h','a','p','p','y'};注意,長(zhǎng)度為5 char a[]="happy"; char a[]={"happy"}; 注意,因?yàn)樽址Y(jié)尾自動(dòng)加'\0',所以char a[]="happy";長(zhǎng)度為6,不是5。 3、C語(yǔ)言中沒有字符串變量,字符串的輸入、存儲(chǔ)、處理和輸出等必須通過(guò)字符數(shù)組實(shí)現(xiàn)。 只能是數(shù)組指針都不行! 4、字符串的輸入。 scanf();可以用%C逐個(gè)字符輸入比如char a[6];for(i=0;i<6;i++) scanf("%c",&a[i]); 可以用%S以字符串的形式輸入,比如char a[6];scanf("%s",a);注意,a前不用加&,因?yàn)閍是數(shù)組名,已經(jīng)代表了數(shù)組首地址。 注意:以%S輸入時(shí),以第一個(gè)非空白字符開始,終止于第一個(gè)空白字符。比如:輸入How are you時(shí)。只輸出How. gets();作用為輸入一個(gè)字符串。與scanf();功能一致,但空格和回車都存放在數(shù)組中,最后自動(dòng)加入‘\0’.不會(huì)出現(xiàn)上面輸出不全的情況。 調(diào)用方式為:gets(數(shù)組名);需要包含頭文件“stdio.h”. 5、字符串的輸出。 printf();可以使用%C逐個(gè)字符輸出,比如:char a[6];for(i=0;i<6;i++) printf("%c",a[i]); 可以用%S以字符串的形式輸出,比如char a[6];printf("%s",a); puts();輸出一個(gè)字符串,結(jié)尾自動(dòng)換行。 調(diào)用形式:puts(字符數(shù)組名或字符串常量);需包含頭文件“stdio.h” 常用字符串處理函數(shù)(以下函數(shù)需要頭文件“string.h”) 1、strlen()作用是測(cè)試字符串長(zhǎng)度。這里不包括‘\0’.使用形式strlen(數(shù)組名或字符串常量) 2、strcat()作用是連接兩個(gè)字符串。調(diào)用方式strcat(字符數(shù)組1名,字符數(shù)組2名);合并后的字符串存放在字符數(shù)組1中。 3、strcmp()比較兩個(gè)字符串是否相等。調(diào)用方式strcmp(字符串1,字符串2);相等時(shí)值為0。1>2時(shí)為正數(shù)。1<2時(shí)為負(fù)數(shù)。 4、strcpy()復(fù)制字符串。調(diào)用方式strcpy(字符數(shù)組1,字符串2);2的內(nèi)容復(fù)制到1中。1只能是字符數(shù)組名。 指針數(shù)組 2、初始化: char *week_day[8]= {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", NULL }; /* 說(shuō)明指針數(shù)組。數(shù)組中的每個(gè)元素指向一個(gè)字符串 */ char *week_day[8]; 數(shù)組必須指定大小,char *week_day[];是錯(cuò)誤的。 可以不指定數(shù)組大小 char * week_day []= {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", NULL }; 3、使用 int *p[10]; p[0]=”asdfghj”; char *a=”asdfghjk”;
4、指向結(jié)構(gòu)體的指針數(shù)組 typedef struct { char s1[81]; char s2[81]; char s3[81]; } Rec; Rec *a[10]; a[0]=(Rec *)malloc(sizeof(Rec)); strcpy(a[0]->s1, "hello"); free(a[0]); 如右圖所示: 5、指向函數(shù)的指針數(shù)組 int functionA(int event); int functionB(int event); ……. int functionZ(int event); typdef int (*pFunc)(int event); // pFunc 是 int (*)(int event)的別名 pFunc functionlist[Z+1] = { functionA, functionB, … , functionZ }; //指向函數(shù)名串的指針數(shù)組 使用: functionlist[i](event);
1、定義: 類型說(shuō)明符 (*指針變量名)[長(zhǎng)度] 注意“(*指針變量名)”兩邊的括號(hào)不可少。 2、使用 int a[10], b[3][4], p = &a; 注意,取一次地址地址相當(dāng)于加一級(jí)指針 p=b; *p+1指向b[0][1], *(p+i)+j則指向數(shù)組元素b[i][j]。 結(jié)構(gòu)體數(shù)組 1、 結(jié)構(gòu)體數(shù)組的定義 對(duì)應(yīng)結(jié)構(gòu)體變量定義方法1 struct student { long num; char name[20]; char sex; char addr[20]; }; struct student students[3]; struct { long num; char name[20]; char sex; char addr[20]; } students[3]; 2、結(jié)構(gòu)體數(shù)組的初始化 初始化方法: 在定義數(shù)組的后面加上 ={初值列表} 如: struct { long num; char name[20]; char sex; char addr[20]; } students[3]={ {10101, "Li Lin", 'M', "Beijing"},{10102, "zhang", 'F', "shanghai"} …...}; 3、使用 students [i].sex=‘F’;
數(shù)組作為函數(shù)參數(shù) 1、 數(shù)組元素作函數(shù)實(shí)參 數(shù)組元素作函數(shù)實(shí)參,與用變量作實(shí)參一樣,是“單向的值傳遞”。 參數(shù)和形參類型要保持一致。 Fun(a[2]);//傳遞的是元素a[2]的值。 2、 數(shù)組名作函數(shù)的實(shí)參和形參。 如: main() {int array[10]; …… f(array,10); …… } f(int arr[],int n); { …… }//注意sizeof(arr)值為4,此處只是傳遞數(shù)組的第一個(gè)元素的地址。 array為實(shí)參數(shù)組名,arr為形參數(shù)組名。數(shù)組名就是數(shù)組的首地址,實(shí)參向形參傳送數(shù)組名實(shí)際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。這就好象同一件物品有兩個(gè)彼此不同的名稱一樣。 同樣,指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組的首地址,也可作為函數(shù)的參數(shù)使用。 用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意以下幾點(diǎn): a. 形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。 b. 形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長(zhǎng)度。當(dāng)形參數(shù)組的長(zhǎng)度與實(shí)參數(shù)組不一致時(shí),雖不至于出現(xiàn)語(yǔ)法錯(cuò)誤(編譯能通過(guò)),但程序執(zhí)行結(jié)果將與實(shí)際不符,這是應(yīng)予以注意的。 c. 在函數(shù)形參表中,允許不給出形參數(shù)組的長(zhǎng)度,或用一個(gè)變量來(lái)表示數(shù)組元素的個(gè)數(shù)。 例如,可以寫為: void fun(int a[]) 或?qū)憺?/span> void fun(int a[],int n) 其中形參數(shù)組a沒有給出長(zhǎng)度,而由n值動(dòng)態(tài)地表示數(shù)組的長(zhǎng)度。n的值由主調(diào)函數(shù)的實(shí)參進(jìn)行傳送。 d. 多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長(zhǎng)度,也可省去第一維的長(zhǎng)度。因此,以下寫法都是合法的。 int MA(int a[3][10]) 或 int MA(int a[][10])。 而int MA (int a[3][]);是不允許的。 |
|
|