C語言總結-----陣列
目錄
一、一維陣列
- 一維陣列的定義格式為: 型別說明符 陣列名[常量表達式];
例如: int a[10]; 它表示定義了一個整形陣列,陣列名為a,有10個整形元素。
- 在定義陣列時,需要指定陣列中元素的個數,方括弧中的常量表達式用來表示元素的個數,即陣列長度。
- 常量表達式中可以包括常量和符號常量,但不能包含變數。
- 注意: C語言不允許對陣列的大小作動態定義,即陣列的大小不依賴於程式執行過程中變數的值。
- 常見的錯誤:
① float a[0]; /* 陣列大小為0沒有意義 */
② int b(2)(3); [ ] /* 不能使用圓括號 */
③ int k, a[k]; /* 不能用變數說明陣列大小*/
(一)一維陣列的引用
- 格式為: 陣列名[下標]
- C語言中,陣列元素的下標從0開始,而且必須為整型常量或變數。
int a= 5; array[a] = 99; (變數) array[0], array[1], array[2], array[3], array[4] (常量)
- 陣列元素本身相當於一個變數,因此,對陣列元素的操作類似於對變數操作。
(二)一維陣列在記憶體中的存放
- 一維陣列: int array[6] = {11,22,33,44,55,66,77}
- 每個資料元素佔用的位元組數,就是基型別(int 4位元組)的位元組數,一個元素佔4個位元組。
- 系統會為一個數組分配一段連續的儲存空間。陣列的首地址就是第0個元素的地址。
(三)一維陣列的初始化
1.在定義陣列時對陣列元素賦以初值。 例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
2. 可以只給一部分元素賦值。例如: int a[10]={0,1,2,3,4}; 只給前面5個元素賦初值,後5個元素值為0。
3. 陣列中全部元素值為0,可以寫成: int a[10]={0,0,0,0,0,0,0,0,0,0}; 或int a[10]={0}
4. 在對全部陣列元素賦初值時,由於資料的個數已經確定,因此可以不指定陣列長度。
例如 : int a[5]={1,2,3,4,5}; 也可以寫成 int a[]={1,2,3,4,5};
二、二維陣列
- 二維陣列定義的一般形式為: 型別說明符 陣列名[常量表達式][常量表達式];
例如:定義a為3×4(3行4列)的陣列,b為5×10(5行10列)的陣列。
int a[3][4],b[5][10] ;
- 注意:我們可以把二維陣列看作是一種特殊的一維陣列:它的元素又是一個一維陣列。
例如:可以把a看作是一個一維陣列,它有3個元素:a[0]、a[1]、a[2],每個元素又是一個包含4個元素的一維陣列。
(一)二維陣列元素的引用
二維陣列元素的引用是以陣列名開頭然後依次指定陣列的下標來引用一個元素。
引用形式為: 陣列名[第一維下標] [第二維下標]
例如:a[i][j]引用了二維陣列a的第i行第j列元素。
(二)二維陣列的記憶體對映
二維陣列在記憶體中是按照二維陣列元素的下標從小到大的順序來儲存的。
即首先儲存二維陣列第一行元素中的所有元素,然後依次儲存接下來的元素。
上述的二維陣列a在記憶體中的對映如表所示。 這裡假設系統為二維陣列a分配的記憶體首地址為BFD5CACC。
記憶體首地址(16進位制) |
陣列元素 |
|
BFD5CACC |
a[0][0] |
a[0] |
BFD5CAD0 |
a[0][1] |
|
BFD5CAD4 |
a[0][2] |
|
BFD5CAD8 |
a[1][0] |
|
a[1] |
||
BFD5CADC |
a[1][1] |
|
BFD5CAE0 |
a[1][2] |
(三)二維陣列的初始化
資料型別 : 陣列名 [常量表達式1][常量表達式2]={ 初始化資料 };
4種方法對二維陣列初始化:
1.分行給二維陣列賦初值。 (除去第一個花括號,一個花括號表示一行)
例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2.可以將所有資料寫在一個花括號內,按陣列排列的順序對各元素賦初值。
例如: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3.可以對部分元素賦初值。
例如: int a[3][4]={{1}, {5}, {9}}; //1 0 0 0 5 0 0 0 9 0 0 0
也可以對各行中的某一元素賦初值,
如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}}; //1 0 0 0 0 6 0 0 0 0 0 11
4.如果對全部元素都賦初值,則定義陣列時對第一維的長度可以不指定,但第二維的長度不能省。
例如: int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};等價於: int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
(四)補充
scanf + %d時,enter認為前一個輸入結束
+ %s時,enter要用getchar()吸收
sizeof + 地址或指標 都是原來定義的位元組數不會改變
sizeof + 陣列名稱 測量整個陣列佔用的位元組
//一維陣列
int array1[10];
printf("sizeof(array1) = %d\n",sizeof(array1)); //40 4*10
//二維陣列
int a[3][2];
printf("sizeof(a) = %d\n",sizeof(a));//24 4*3*2
三、字元陣列
例如:char c[10]; c[0]=′I′ ; c[1]=′ ′; c[2[=′a′; c[3]=′m′; c[4]=′ ′; c[5]=′h′; c[6]=′a′; c[7]=′p′; c[8]=′p′; c[9]=′y′;
對字元陣列初始化,可逐個字元賦給陣列中各元素。 例如: char c[10]={‘I’, ‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’,‘p’, ‘p’,‘y’}
(一)字串和字串結束標誌
為了測定字串的實際長度,C語言規定了一個“字串結束標誌”——‘\0’。
(二)字元陣列的輸入輸出
字元陣列的輸入輸出可以有兩種方法:
- 逐個字元輸入輸出。用格式符“%c”輸入或輸出一個字元。
- 將整個字串一次輸入或輸出。用“%s”格式符,意思是對字串的輸入輸出。
說明:
(1)用“%s”格式符輸出字串時,printf函式中的輸出項是字元陣列名,而不是陣列元素名。
(2)如果陣列長度大於字串實際長度,也只輸出到遇′\0′結束。
(3)輸出字元不包括結束符′\0′。
(4)如果一個字元陣列中包含一個以上′\0′,則遇第一個′\0′時輸出就結束。
(5)可以用scanf函式輸入一個字串%s。(在輸入時以空格分隔)
例如:scanf(″%s %s %s″,str1,str2,str3);
輸入資料:How are you? 陣列中未被賦值的元素的值自動置′\0′。
(三)字串處理函式
1. puts函式
其一般形式為: puts (字元陣列)
其作用是將一個字串(以′\0′結束的字元序列)輸出到終端並加上換行符。
假如已定義str是一個字元陣列名,且該陣列已被初始化為"China"。則執行puts(str);其結果是在終端上輸出China。
用puts函式輸出的字串中可以包含轉義字元。
例如: char str[]={″China\nBeijing″};
puts(str);
輸出結果: China
Beijing
(空行)
在輸出時,將字串結束標誌′\0′轉換成′\n′, 即輸出完字串後換行。
2. gets函式 (儘量少用,字串有空格時建議用)
其一般形式為:gets(字元陣列)
其作用是從終端輸入一個字串到字元陣列。該函式值是字元陣列的起始地址。
注:1、gets以回車鍵表示輸入結束,scanf以回車鍵和空格表示輸入結束。如輸入的字元中含有空格,則使用gets。
2、因為gets函式未能指定緩衝區大小,Linux中將提醒warning: the `gets' function is dangerous and should not be used.
以下 的字串處理函式需要加入標頭檔案#include<string.h>
3. strlen函式
其一般形式為: strlen (字元陣列)
strlen是測試字串長度的函式。
函式的值為字串中的實際長度(不包括′\0′在內)。sizeof()則包括'\0'
char str[10]={″China″};
printf(″%d\n″,strlen(str)); //5
printf("%d\n", sizeof(str)); //10
4. strcat函式
其一般形式為:strcat(字元陣列1,字元陣列2)
Strcat的作用是連線兩個字元陣列中的字串,把字串2接到字串1的後面,結果放在字元陣列1中。
函式呼叫後得到一個函式值——字元陣列1的地址。
char c1[20] = "hello";
char c2[10] = "world";
if(strlen(c1) + strlen(c2) < sizeof(c1)
{
strcat(c1,c2);
printf("%s\n",c1); //helloworld
}
5. strcpy函式
其一般形式為:strcpy(字元陣列1,字串2)
strcpy是“字串複製函式”。 作用:是將字串2複製到字元陣列1中去。
例如: char str1[10],str2[]={″China″};
strcpy(str1,”china”);
注意:
(1)字元陣列1必須定義得足夠大,以便容納被複制的字串。字元陣列1的長度不應小於字串2的長度。
(2)“字元陣列1”必須寫成陣列名形式(如str1), “字串2”可以是字元陣列名,也可以是一個字串常量。
如:strcpy(str1,″China″);
(3)複製時連同字串後面的′\0′一起復制到字元陣列1中。
(4)可以用strcpy函式將字串2中前面若干個字元複製到字元陣列1中去。
例如:strncpy(str1,str2,2);作用是將str2中前面2個字元複製到str1中去,然後再加一個‘\0’。
(5)不能用賦值語句將一個字串或字元陣列直接給另一個字元陣列。
如: str1=″China″; 不合法
str1=str2; 不合法
- 用strcpy函式只能將一個字串複製到另一個字元陣列中去。
- 用賦值語句只能將一個字元賦給一個字元型變數或字元陣列元素。
- 下面是合法的使用:
char a[5],c1,c2;
c1=′A′; c2=′B′; a[0]=′C′;
a[1]=′h′; a[2]=′i′;
a[3]=′n′; a[4]=′a′;
6. strcmp函式
其一般形式為:strcmp(字串1,字串2)
strcmp的作用是比較字串1和字串2。
例如: strcmp(str1,str2); strcmp(″China″,″Korea″); strcmp(str1,″Beijing″);
比較的結果由函式值帶回
(1) 如果字串1=字串2,函式值為0。
(2) 如果字串1>字串2,函式值為1。
(3) 如果字串1<字串2,函式值為-1。
注意:對兩個字串比較,不能用以下形式:
if(str1>str2) printf(″yes″);
而只能用
if(strcmp(str1,str2)>0) printf(″yes″);