一、基本概念
? ? ? ?數組是一組相同類型的值被順序地儲存在一起。數組表示方法為變量名加方括號,方括號里是數組的成員數量。例如:
? ? ? ?int arr[20];? //聲明了一個 int 類型的名為 arr 包含20個成員的數組
? ? ? ?數組的成員是從0開始編號的,所以數組的編號永遠小于成員數量,這也是遍歷數組時循環條件用 "<" 而不用 "<=" 的原因。?數組名加方括號和指定編號,就可以像普通變量那樣為其賦值或引用這個成員。例如:
? ? ? ?arr[10]=100;
? ? ? ?int x=2*arr[10];
? ? ? ?注意: 如果引用不存在的數組成員(即越界訪問數組)寫代碼時并不會報錯,有些在編譯時會被發現,有些編譯時也發現不了。使用數組越界是非常值得重視的問題。例如,接上面的例子:
? ? ? ? for(int i=0;i<=20;i++)
? ? ? ? {
? ? ? ? ? ? printf("%d",arr[i]); //當i=20時數組越界,這是很容易犯的錯誤
? ? ? ? }
? ? ? ?數組可以在聲明時(僅在聲明時),使用大括號同時對每一個成員賦值;數組聲明后的賦值也稱為數組的初始化。例如:
? ? ? ?int arr02[5] = {1,2,3,4,5}; //如賦值不足5個,剩余的會賦成0
? ? ? 當我們聲明成員數量大的數組時,為防止訪問時出現莫名其妙的值,可以一次性全部賦值成0(初始化成0),做法如下:
? ? ? ?int arr03[1024]={0};
? ?如果我們在聲明時即全部賦初值,可以省略"[ ]"中的成員數,編譯器會自動補上。
? ? ? ?int arr04[]={6,7,8,9,10,11}; //可以正常編譯
二、數組長度
? ? ? ?sizeof 是一個運算符(也可以理解成是函數),它可以返回數組的字節長度。返回的具體字節長度與數組的類型、成員個數及使用的系統相關。以int arr[20]為例:
? ? ? ?int a = sizeof(arr);? //以數組名為參數,返回整個數組的字節長度
? ? ? ?int b = sizeof(arr[0]);? //以某一成員為參數,返回單個成員的字節長度
? ? ? ?int c = sizeof(arr) / sizeof(arr[0]); //可以計算出數組的成員個數
三、多維數組
? ? ? ?數組名稱后帶有多對中括號的數組稱為多維數組。兩對 "[ ]" 的是二維數組,三對 "[ ]" 的是三數組,依此類推。
? ? ? ?以二維數組為例:
? ? ? ?int arr[3][4]; //聲明了一個3行4列的二維數組
? ? ? 二維數組也可以用{ }賦初值,{ 0 }給所有成員賦初值0。在用{ }賦初值時,為了行列顯示清楚,可以多加幾對大括號。舉例:
? ? ? int arr[3][4]={ ? {1,2,3,4},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{4,3,2,1},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{5,6,7,8} ?};? //如把內部的三對大括號拿掉也不影響賦值,帶上層次更清楚。
四、附上一個遍歷二維數組并計算數組字節長度的小程序:
#include<stdio.h>
int main(void)
{
//a.聲明數組并賦初值int arr[3][4] = { {1,2,3,4},{4,3,2,1},{5,6,7,8} };
//b.通過兩重循環遍歷二維數組for (int i = 0; i < 3; i++) //一般外層循環行(反過來也無所謂){for (int j = 0; j < 4; j++) //內層循環列{printf(" %d", arr[i][j]); //顯示數組成員的值}printf("\n"); //顯示一行結束時換行}
//c.計算數組字節長度等信息int sum = sizeof(arr);//返回整個數組字節總長度int a = (int)sizeof(arr) / sizeof(arr[0]); //返回數組行數int b = (int)sizeof(arr[0])/sizeof(arr[0][0]); //返回數組行數int c = (int)sizeof(arr) / sizeof(arr[0][0]); //返回數組成員數printf("數組總字節長%d 行%d 列%d 成員總數%d", sum,a,b,c);getchar();return 0;
}
//運行結果:
? ? ?1 ? 2 ? 3 ? 4
? ? ?4 ? 3 ? 2 ? 1
? ? ?5 ? 6 ? 7 ? 8
? ? ?數組總字節長48 ?行3 列4 成員總數12
? ? ?實際上在計算機內部,二維數組的存儲也是線性的沒有行和列之分,一字排開,arr[0][0]是第一個,的后面是arr[0][1],接著arr[0][2],再后邊arr[0][3]、arr[1][0]、arr[1][1]、......、直到arr[2][2]、arr[2][3]。推而廣之,三維、四維也是一樣。