參考資料:
高教版《全國計算機等級考試二級教程——C語言程序設(shè)計》
《21天學(xué)通C語言》
二維數(shù)組的定義和二維數(shù)組元素的引用
二維數(shù)組的定義
當數(shù)組中的每個元素帶有兩個下標時弱匪,稱這樣的數(shù)組為二維數(shù)組门烂。
二維數(shù)組的定義語句如下:
類型名 數(shù)組名[常量表達式1][常量表達式2]澎胡;
例如疲酌,有以下定義:
int a[3][4];
在這里,int是類型名,a[3][4]是一個二維數(shù)組說明符鼎天。可以認為此定義語句說明了:
- 定義了一個名為a的二維數(shù)組
- a數(shù)組中每個元素都是整型
- a數(shù)組中共有3×4個元素
- a數(shù)組的邏輯結(jié)構(gòu)是一個3行4列的矩陣
二維數(shù)組中熟丸,每個元素有兩個下標训措,第一個方括號中的下標代表行號,稱行下標光羞;第二個方括號中的下標代表列號绩鸣,稱列下標。行下標和列下標的下限總為0纱兑。
a數(shù)組中的元素在內(nèi)存中占一系列的存儲單元呀闻。數(shù)組元素在內(nèi)存中的排列順序為:先存放第0行的元素,再存放第1行的元素潜慎,以此類推捡多。這種存放順序稱為“按行存放”。所以铐炫,在C語言中垒手,可以把一個二維數(shù)組看成是一個一維數(shù)組,每個數(shù)組元素又是包含有若干個元素的一維數(shù)組倒信。
二維數(shù)組元素的引用
引用二維數(shù)組時必須帶有兩個下標科贬。引用形式如下:
數(shù)組名[下標表達式1][下標表達式2]
例如,有以下定義:
double w[4][2];
則以下都是合法的數(shù)組元素引用形式:
w[0][1]
w[i][j]
w[i + k][j + k]
注意:每個下標表達式的值必須是整數(shù)鳖悠,且不得超越數(shù)組定義中的上榜掌、下界。
二維數(shù)組的初始化
所賦初值的個數(shù)與數(shù)組元素的個數(shù)相同
可以在定義二維數(shù)組的同時給二維數(shù)組的各元素賦初值乘综。例如:
int a[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
全部初值括在一對花括號中憎账,每一行的初值又分別括在一對花括號中,之間用逗號隔開卡辰。
每行所賦初值個數(shù)與數(shù)組元素的個數(shù)不同
當某行一對花括號內(nèi)的初值個數(shù)少于該行中元素的個數(shù)時胞皱,例如:
int a[4][3] = {{1, 2}, {4, 5}, {7}, {10}};
系統(tǒng)將自動給該行后面的元素補初值0邪意。
所賦初值行數(shù)少于數(shù)組行數(shù)
當代表給每行賦初值的行花括號對少于數(shù)組的行數(shù)時,例如:
int a[4][3] = {{1, 2}, {4, 5}};
系統(tǒng)將自動給后面各行的元素補初值0反砌。
賦初值時省略行花括號對
在給二維數(shù)組賦初值時可以不用行花括號對抄罕,例如:
int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
賦值后結(jié)果如下:
a[0][0]中儲存的是1
a[0][1]中儲存的是2
a[0][2]中儲存的是3
a[1][0]中儲存的是4
a[1][1]中儲存的是5
a[1][2]中儲存的是6
a[2][0]中儲存的是7
a[2][1]中儲存的是8
a[2][2]中儲存的是9
a[3][0]中儲存的是10
a[3][1]中儲存的是11
a[3][2]中儲存的是12
通過賦初值定義二維數(shù)組的大小
對于二維數(shù)組,只可以省略第一個方括號中的常量表達式于颖,而不能省略第二個方括號中的常量表達式。例如:
int a[][3] = {{1, 2, 3}, {4, 5}, {6}, {8}};
在所賦初值中嚷兔,第一維的大小由所賦初值的行數(shù)來決定森渐。
當用這種形式賦初值時:
int c[][3] = {1, 2, 3, 4, 5};
第一維的大小按以下規(guī)則決定:
- 當初值個數(shù)能被第二位的常量表達式的值除盡時,所得商數(shù)就是第一維的大小冒晰。
- 當初值的個數(shù)不能被第二位的常量表達式的值除盡時同衣,則第一位的大小等于所得商數(shù)加一。
二維數(shù)組和指針
二維數(shù)組元素的地址
先給出以下定義:
int *p, a[3][4];
二維數(shù)組a由若干個一維數(shù)組組成
在C語言中定義的二維數(shù)組實際上是一個一維數(shù)組壶运,這個一維數(shù)組的每個元素又是一個一維數(shù)組耐齐。
如以上二維數(shù)組,可以將數(shù)組a看作由a[0],a[1],a[2]三個元素組成蒋情,而a[0],a[1],a[2]中每個元素又是由四個整形元素組成的一維數(shù)組埠况。a[0],a[1],a[2]都是一維數(shù)組名,同樣也代表一個不可變的地址常量棵癣,其值依次為二維數(shù)組每行第一個元素的地址辕翰,其基類型就是數(shù)組元素的類型。
二維數(shù)組名也是一個地址值變量
二維數(shù)組名同樣也是一個存放地址常量的指針狈谊,其值為二維數(shù)組中第一個元素的地址喜命。
a[0],a[1],a[2]的值分別表示a數(shù)組中第一、第二河劝、第三行的首地址壁榕。
二維數(shù)組名應(yīng)理解為一個行指針,在表達式a+1中赎瞎,數(shù)值1的單位應(yīng)當是4×2個字節(jié)牌里,而不是2個字節(jié)。
對于二維數(shù)組名a煎娇,不可以進行a++二庵,a=a+i等操作。
二維數(shù)組元素的地址
二維數(shù)組元素的地址可以由表達式&a[i][j]求得缓呛,也可以通過每行的首地址來表示催享。
若0≤i<3,0≤j<4,則a[i][j]的地址可以用以下五種表達式求得:
- &a[i][j]
- a[i]+j
- *(a+i)+j
- &a[0][0]+4 * i+j
- a[0]+4 * i+j
通過地址引用二維數(shù)組元素
若有以下定義:
int a[3][4], i, j;
并且0≤i<3,0≤j<4哟绊,則a數(shù)組元素可用以下表達式來引用:
- a[i][j]
- *(a[i]+j)
- *(*(a+i)+j)
- (*(a+i))[j]
- *(&a[0][0]+4 * i+j)
通過建立一個指針數(shù)組引用二維數(shù)組元素
若有以下定義:
int *p[3], a[3][2], i, j;
在這里因妙,說明符*p[3]說明了p是一個數(shù)組名,系統(tǒng)將為它開辟3個連續(xù)的存儲單元;*號說明了數(shù)組p是指針類型攀涵,它的每個元素都是基類型為int的指針铣耘。
若滿足條件0≤i<3,則p[i]和a[i]的基類型相同以故,p[i]=a[i]是合法的表達式蜗细。
通過建立一個行指針引用二維數(shù)組元素
若有以下定義:
int a[3][2], (*prt)[2];
說明符(*prt)[2]說明了指針變量prt的基類型是一個包含有兩個int元素的數(shù)組。
在這里怒详,prt的基類型與a相同炉媒,因此prt = a是合法的賦值語句,prt+1等于a+1昆烁,等價于a[1]吊骤。
二維數(shù)組名和指針數(shù)組作為實參
二維數(shù)組名作為實參時實參和形參之間的數(shù)據(jù)傳遞
當二維數(shù)組名作為實參時,對應(yīng)的形參必須是一個行指針變量静尼。
例如白粉,若有以下定義語句和調(diào)用語句:
#include <stdio.h>
#define M 5
#define N 3
int main (void)
{
double s[M][N];
//部分代碼省略
fun(s);
//部分代碼省略
}
則fun函數(shù)的首部可以是以下三種形式之一:
fun(double (*a)[N])
fun(double a[][N])
fun(double a[M][N])
注意:列下標不可缺。
指針數(shù)組作為實參時實參和形參之間的數(shù)據(jù)傳遞
當指針數(shù)組名作為實參時鼠渺,對應(yīng)的形參應(yīng)當是一個指向指針的指針鸭巴。
例如,若有以下定義語句和調(diào)用語句:
#include <stdio.h>
#define M 5
#define N 3
int main (void)
{
double s[M][N], *ps[M];
//部分代碼省略
fun(ps);
//部分代碼省略
}
則fun函數(shù)的首部可以是以下三種形式之一:
fun(double *a[M])
fun(double *a[])
fun(double **a)