C語言數組
-
數組的定義
數組是用來存放數據類型相同且邏輯意義相同的數據 -
數組的大小
數組的大小不能是變量,必須是常量或者常量表達式,常量表達式由編譯器編譯時自動求值。
也可以不指定數組大小,但必須對數組進行初始化,編譯器在編譯時會根據初始化列表中元
素的個數計算數組大小,例如:int nAry[]={1,3,4};
-
數組的初始化
在定義數組時可以使用初始化列表進行初始化,例如:int nAry[3]={0,3,3};
但是只能在定義時使用這種方式賦值,在其他地方只能進行單個元素賦值.
如果數組的數據類型是基本數據類型,如果在初始化列表中只對前面幾個
元素進行初始化,后面沒有進行賦值初始化,那么剩下的元素將被初始化
為0,例:
-
關於數組名
- 數組名是數組的首地址,它是一個常量,所以不可以對數組名使用自增或者自減運算符
- 對數組名使用sizeof運算符,可以獲取到數組所占用的字節數,但是如果數組名做為參
數傳遞給函數,在函數內部對這個數組參數使用sizeof,求得的只是這個指針參數的大
小,並不是數組大小. 例:
-
數組尋址:
-
一維數組尋址
設有一維數組Type Arry[N],其中Type表示數組中元素的類型,Arry表示數組名,
N表示元素個數,那么數組中第n個元素的內存地址為:(int)Arry+n*sizeof(Type)
例:
-
二維數組尋址
設有二維數組Type Arry[M][N],那么數組中第Arry[m][n]個元素的內存地址為:
(int)Arry+sizeof(Arry[0])m+sizeof(Type)n
例:int nAry[10][3]; for (int iIndex = 0; iIndex < 10; iIndex++) { for (int jIndex = 0; jIndex < 3; jIndex++) { printf("nAry[%d][%d]地址:%08X\t", iIndex, jIndex,&nAry[iIndex][jIndex]); printf("手工計算nAry[%d[%d]地址:%08X\r\n", iIndex, jIndex, (int)nAry + sizeof(nAry[0])*iIndex+sizeof(int)*jIndex); } }
運行結果:
-
三維數組尋址
設數組Type Arry[M][N][P],那么數組中第Arry[m][n][p]個元素的內存地址為:
(int)Arry + sizeof(Arry[0])M + sizeof(Type)(n*P+p);
例:int nAry1[3][4][5]; for (int iIndex = 0; iIndex < 3; iIndex++) { for (int jIndex = 0; jIndex < 4; jIndex++) { for (int mIndex = 0; mIndex < 5; mIndex++) { printf("nAry[%d][%d][%d]地址:%08X\t", iIndex, jIndex, mIndex, &nAry1[iIndex][jIndex][mIndex]); printf("手工計算nAry[%d][%d][%d]地址:%08X\r\n", iIndex, jIndex, mIndex, (int)nAry1 + sizeof(nAry1[0])*iIndex + sizeof(int)*(jIndex * 5 + mIndex)); } } }
運行結果:
-
任意多維數組尋址
設多維數組Type Arry[M][N][O].....[Y][Z],那么該數組中任意一個數組元素
Arry[m][n]....[y][z]的內存地址為:
(int)Arry + sizeof(Arry[0])*m + sizeof(Type)*(n*O+..+y*Z+z)
-