2019-02-28 計算機二級C語言程序設(shè)計之數(shù)組(下)

參考資料:
高教版《全國計算機等級考試二級教程——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ī)則決定:

  1. 當初值個數(shù)能被第二位的常量表達式的值除盡時,所得商數(shù)就是第一維的大小冒晰。
  2. 當初值的個數(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]的地址可以用以下五種表達式求得:

  1. &a[i][j]
  2. a[i]+j
  3. *(a+i)+j
  4. &a[0][0]+4 * i+j
  5. a[0]+4 * i+j

通過地址引用二維數(shù)組元素

若有以下定義:

int a[3][4], i, j;

并且0≤i<3,0≤j<4哟绊,則a數(shù)組元素可用以下表達式來引用:

  1. a[i][j]
  2. *(a[i]+j)
  3. *(*(a+i)+j)
  4. (*(a+i))[j]
  5. *(&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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拦盹,一起剝皮案震驚了整個濱河市奕扣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掌敬,老刑警劉巖惯豆,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奔害,居然都是意外死亡楷兽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門华临,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯杀,“玉大人,你說我怎么就攤上這事雅潭〗液瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵扶供,是天一觀的道長筛圆。 經(jīng)常有香客問我,道長椿浓,這世上最難降的妖魔是什么太援? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任闽晦,我火速辦了婚禮,結(jié)果婚禮上提岔,老公的妹妹穿的比我還像新娘仙蛉。我一直安慰自己,他們只是感情好碱蒙,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布荠瘪。 她就那樣靜靜地躺著,像睡著了一般赛惩。 火紅的嫁衣襯著肌膚如雪巧还。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天坊秸,我揣著相機與錄音,去河邊找鬼澎怒。 笑死褒搔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喷面。 我是一名探鬼主播星瘾,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惧辈!你這毒婦竟也來了琳状?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盒齿,失蹤者是張志新(化名)和其女友劉穎念逞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體边翁,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡翎承,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了符匾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叨咖。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啊胶,靈堂內(nèi)的尸體忽然破棺而出甸各,到底是詐尸還是另有隱情,我是刑警寧澤焰坪,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布趣倾,位于F島的核電站,受9級特大地震影響某饰,放射性物質(zhì)發(fā)生泄漏誊酌。R本人自食惡果不足惜部凑,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧浊。 院中可真熱鬧涂邀,春花似錦、人聲如沸箱锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驹止。三九已至浩聋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臊恋,已是汗流浹背衣洁。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抖仅,地道東北人坊夫。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像撤卢,于是被迫代替她去往敵國和親环凿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355