2019-02-28 計(jì)算機(jī)二級(jí)C語(yǔ)言程序設(shè)計(jì)之?dāng)?shù)組(下)

參考資料:
高教版《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程——C語(yǔ)言程序設(shè)計(jì)》
《21天學(xué)通C語(yǔ)言》

二維數(shù)組的定義和二維數(shù)組元素的引用

二維數(shù)組的定義

當(dāng)數(shù)組中的每個(gè)元素帶有兩個(gè)下標(biāo)時(shí),稱這樣的數(shù)組為二維數(shù)組

二維數(shù)組的定義語(yǔ)句如下:

類型名 數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];

例如,有以下定義:

int a[3][4];

在這里,int是類型名,a[3][4]是一個(gè)二維數(shù)組說(shuō)明符??梢哉J(rèn)為此定義語(yǔ)句說(shuō)明了:

  • 定義了一個(gè)名為a的二維數(shù)組
  • a數(shù)組中每個(gè)元素都是整型
  • a數(shù)組中共有3×4個(gè)元素
  • a數(shù)組的邏輯結(jié)構(gòu)是一個(gè)3行4列的矩陣

二維數(shù)組中,每個(gè)元素有兩個(gè)下標(biāo),第一個(gè)方括號(hào)中的下標(biāo)代表行號(hào),稱行下標(biāo);第二個(gè)方括號(hào)中的下標(biāo)代表列號(hào),稱列下標(biāo)。行下標(biāo)和列下標(biāo)的下限總為0。

a數(shù)組中的元素在內(nèi)存中占一系列的存儲(chǔ)單元。數(shù)組元素在內(nèi)存中的排列順序?yàn)椋合却娣诺?行的元素,再存放第1行的元素,以此類推。這種存放順序稱為“按行存放”。所以,在C語(yǔ)言中,可以把一個(gè)二維數(shù)組看成是一個(gè)一維數(shù)組,每個(gè)數(shù)組元素又是包含有若干個(gè)元素的一維數(shù)組。

二維數(shù)組元素的引用

引用二維數(shù)組時(shí)必須帶有兩個(gè)下標(biāo)。引用形式如下:

數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]

例如,有以下定義:

double w[4][2];

則以下都是合法的數(shù)組元素引用形式:

w[0][1]
w[i][j]
w[i + k][j + k]

注意:每個(gè)下標(biāo)表達(dá)式的值必須是整數(shù),且不得超越數(shù)組定義中的上、下界。

二維數(shù)組的初始化

所賦初值的個(gè)數(shù)與數(shù)組元素的個(gè)數(shù)相同

可以在定義二維數(shù)組的同時(shí)給二維數(shù)組的各元素賦初值。例如:

int a[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};

全部初值括在一對(duì)花括號(hào)中,每一行的初值又分別括在一對(duì)花括號(hào)中,之間用逗號(hào)隔開。

每行所賦初值個(gè)數(shù)與數(shù)組元素的個(gè)數(shù)不同

當(dāng)某行一對(duì)花括號(hào)內(nèi)的初值個(gè)數(shù)少于該行中元素的個(gè)數(shù)時(shí),例如:

int a[4][3] = {{1, 2}, {4, 5}, {7}, {10}};

系統(tǒng)將自動(dòng)給該行后面的元素補(bǔ)初值0。

所賦初值行數(shù)少于數(shù)組行數(shù)

當(dāng)代表給每行賦初值的行花括號(hào)對(duì)少于數(shù)組的行數(shù)時(shí),例如:

int a[4][3] = {{1, 2}, {4, 5}};

系統(tǒng)將自動(dòng)給后面各行的元素補(bǔ)初值0。

賦初值時(shí)省略行花括號(hào)對(duì)

在給二維數(shù)組賦初值時(shí)可以不用行花括號(hào)對(duì),例如:

int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

賦值后結(jié)果如下:

a[0][0]中儲(chǔ)存的是1

a[0][1]中儲(chǔ)存的是2

a[0][2]中儲(chǔ)存的是3

a[1][0]中儲(chǔ)存的是4

a[1][1]中儲(chǔ)存的是5

a[1][2]中儲(chǔ)存的是6

a[2][0]中儲(chǔ)存的是7

a[2][1]中儲(chǔ)存的是8

a[2][2]中儲(chǔ)存的是9

a[3][0]中儲(chǔ)存的是10

a[3][1]中儲(chǔ)存的是11

a[3][2]中儲(chǔ)存的是12

通過(guò)賦初值定義二維數(shù)組的大小

對(duì)于二維數(shù)組,只可以省略第一個(gè)方括號(hào)中的常量表達(dá)式,而不能省略第二個(gè)方括號(hào)中的常量表達(dá)式。例如:

int a[][3] = {{1, 2, 3}, {4, 5}, {6}, {8}};

在所賦初值中,第一維的大小由所賦初值的行數(shù)來(lái)決定。

當(dāng)用這種形式賦初值時(shí):

int c[][3] = {1, 2, 3, 4, 5};

第一維的大小按以下規(guī)則決定:

  1. 當(dāng)初值個(gè)數(shù)能被第二位的常量表達(dá)式的值除盡時(shí),所得商數(shù)就是第一維的大小。
  2. 當(dāng)初值的個(gè)數(shù)不能被第二位的常量表達(dá)式的值除盡時(shí),則第一位的大小等于所得商數(shù)加一。

二維數(shù)組和指針

二維數(shù)組元素的地址

先給出以下定義:

int *p, a[3][4];

二維數(shù)組a由若干個(gè)一維數(shù)組組成

在C語(yǔ)言中定義的二維數(shù)組實(shí)際上是一個(gè)一維數(shù)組,這個(gè)一維數(shù)組的每個(gè)元素又是一個(gè)一維數(shù)組。

如以上二維數(shù)組,可以將數(shù)組a看作由a[0],a[1],a[2]三個(gè)元素組成,而a[0],a[1],a[2]中每個(gè)元素又是由四個(gè)整形元素組成的一維數(shù)組。a[0],a[1],a[2]都是一維數(shù)組名,同樣也代表一個(gè)不可變的地址常量,其值依次為二維數(shù)組每行第一個(gè)元素的地址,其基類型就是數(shù)組元素的類型。

二維數(shù)組名也是一個(gè)地址值變量

二維數(shù)組名同樣也是一個(gè)存放地址常量的指針,其值為二維數(shù)組中第一個(gè)元素的地址。

a[0],a[1],a[2]的值分別表示a數(shù)組中第一、第二、第三行的首地址。

二維數(shù)組名應(yīng)理解為一個(gè)行指針,在表達(dá)式a+1中,數(shù)值1的單位應(yīng)當(dāng)是4×2個(gè)字節(jié),而不是2個(gè)字節(jié)。

對(duì)于二維數(shù)組名a,不可以進(jìn)行a++,a=a+i等操作。

二維數(shù)組元素的地址

二維數(shù)組元素的地址可以由表達(dá)式&a[i][j]求得,也可以通過(guò)每行的首地址來(lái)表示。

若0≤i<3,0≤j<4,則a[i][j]的地址可以用以下五種表達(dá)式求得:

  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

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

若有以下定義:

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

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

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

通過(guò)建立一個(gè)指針數(shù)組引用二維數(shù)組元素

若有以下定義:

int *p[3], a[3][2], i, j;

在這里,說(shuō)明符*p[3]說(shuō)明了p是一個(gè)數(shù)組名,系統(tǒng)將為它開辟3個(gè)連續(xù)的存儲(chǔ)單元;*號(hào)說(shuō)明了數(shù)組p是指針類型,它的每個(gè)元素都是基類型為int的指針。

若滿足條件0≤i<3,則p[i]和a[i]的基類型相同,p[i]=a[i]是合法的表達(dá)式。

通過(guò)建立一個(gè)行指針引用二維數(shù)組元素

若有以下定義:

int a[3][2], (*prt)[2];

說(shuō)明符(*prt)[2]說(shuō)明了指針變量prt的基類型是一個(gè)包含有兩個(gè)int元素的數(shù)組。

在這里,prt的基類型與a相同,因此prt = a是合法的賦值語(yǔ)句,prt+1等于a+1,等價(jià)于a[1]。

二維數(shù)組名和指針數(shù)組作為實(shí)參

二維數(shù)組名作為實(shí)參時(shí)實(shí)參和形參之間的數(shù)據(jù)傳遞

當(dāng)二維數(shù)組名作為實(shí)參時(shí),對(duì)應(yīng)的形參必須是一個(gè)行指針變量。

例如,若有以下定義語(yǔ)句和調(diào)用語(yǔ)句:

#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])

注意:列下標(biāo)不可缺。

指針數(shù)組作為實(shí)參時(shí)實(shí)參和形參之間的數(shù)據(jù)傳遞

當(dāng)指針數(shù)組名作為實(shí)參時(shí),對(duì)應(yīng)的形參應(yīng)當(dāng)是一個(gè)指向指針的指針。

例如,若有以下定義語(yǔ)句和調(diào)用語(yǔ)句:

#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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容