溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言二維數(shù)組是什么

發(fā)布時(shí)間:2021-08-27 18:10:36 來(lái)源:億速云 閱讀:173 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“C語(yǔ)言二維數(shù)組是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

  二維數(shù)組的定義

  同一維數(shù)組一樣,既支持 C89 標(biāo)準(zhǔn)的二維靜態(tài)數(shù)組,又支持 C99 標(biāo)準(zhǔn)的二維動(dòng)態(tài)數(shù)組或變長(zhǎng)數(shù)組。某些 C 編譯器還沒(méi)更新到支持 C99 標(biāo)準(zhǔn)的語(yǔ)法,故可能在一些編譯器中變長(zhǎng)數(shù)組會(huì)報(bào)錯(cuò)。如無(wú)特殊說(shuō)明,教程中所指二維數(shù)組,均默認(rèn)為靜態(tài)數(shù)組。

  靜態(tài)二維數(shù)組定義的一般格式為:

  類型 數(shù)組名[第一維大小][第二維大小];

  其中,第一、二維的大小一般均為常量表達(dá)式。

  例如:

  int a[4][5];

  定義了一個(gè) 4 行 5 列的 int 型二維數(shù)組 a。

  float sc[3][4];

  定義了一個(gè) 3 行 4 列的 float 型二維數(shù)組 sc。

  如下二維數(shù)組的定義形式均是錯(cuò)誤的。

  int a[][3];//錯(cuò)誤。編譯器無(wú)法確定所需空間int a[2][];//錯(cuò)誤。缺少列下標(biāo),編譯器無(wú)法確定所需空間

  動(dòng)態(tài)數(shù)組例子如下(僅做了解)。

  int n=2;int a[n][3];//動(dòng)態(tài)數(shù)組,正確的C99語(yǔ)法。但在某些編譯器中可能報(bào)錯(cuò)int a[2][n];//動(dòng)態(tài)數(shù)組,正確的C99語(yǔ)法

  定義時(shí)未初始化的數(shù)組,其數(shù)據(jù)元素的值一般為無(wú)意義的隨機(jī)值,如:

  int a[2][3];//該數(shù)組的6個(gè)元素均為隨機(jī)值

  可以把二維數(shù)組看成一個(gè)特殊的一維數(shù)組,它的每個(gè)元素又是一個(gè)一維數(shù)組。例如,定義一個(gè)表示 3 個(gè)學(xué)生 4 門課程成績(jī)的二維數(shù)組:

  int sc[3][4];

  定義了一個(gè) 3 行 4 列的二維數(shù)組 sc,該二維數(shù)組可表示 3 個(gè)對(duì)象(學(xué)生),從這個(gè)角度看,該二維數(shù)組可以看成含 3 個(gè)對(duì)象(學(xué)生)的一維數(shù)組,3 個(gè)對(duì)象(元素)分別為:sc[0]、sc[1]、sc[2],其中 sc 為該一維數(shù)組名。

  每個(gè)對(duì)象(元素)sc[i] 又是一個(gè)包含 4 個(gè)屬性(4 門成績(jī))的一維數(shù)組,4 個(gè)屬性分別 為:sc[i][0](語(yǔ)文)、sc[i][1](數(shù)學(xué))、sc[i][2](外語(yǔ))、sc[i][3](C 語(yǔ)言)。每一行表示一個(gè)學(xué)生,每一列表示一門課程,形成如下所示的行列矩陣形式。

  語(yǔ)文 數(shù)學(xué) 外語(yǔ) c語(yǔ)言

  sc[0](第一個(gè)學(xué)生)-----sc[0][0] sc[0][1] sc[0][2] sc[0][3]

  sc[1](第二個(gè)學(xué)生)-----sc[1][0] sc[1][l] sc[1][2] sc[1][3]

  sc[2](第三個(gè)學(xué)生)-----sc[2][0] sc[2][1] sc[2][2] sc[2][3]

  二維數(shù)組名 sc 是首對(duì)象(第一個(gè)學(xué)生)sc[0] 的地址,即 sc=&sc[0]。二維數(shù)組名加 1 表示跳過(guò)一個(gè)對(duì)象,即 sc+1 為第二個(gè)對(duì)象(學(xué)生)sc[1] 的地址,sc+2 為第三個(gè)對(duì)象(學(xué)生)sc[2] 的地址。

  從行列式角度分析,二維數(shù)組名即首行的地址,C 語(yǔ)言中的地址一般均是空間首地址。故二維數(shù)組名是首行首地址,該數(shù)組名加 1 表示跳過(guò)一整行,到達(dá)第二行的首地址,以此類推。

  【例 1】以下二維數(shù)組 sc 用于保存 3 個(gè)學(xué)生的 4 門課程(語(yǔ)數(shù)外及 C 語(yǔ)言)成績(jī)。根據(jù)程序的運(yùn)行結(jié)果,分析二維數(shù)組名的含義。

  #includeint main (void){ int sc[3][4]; printf("sc=%p\n",sc); printf ("&sc[0]=%p\n",&sc[0]); printf("sc+1=%p\n",sc+1); printf("sc+2=%p\n",sc+2); return 0;}

  程序某次運(yùn)行的結(jié)果:

  sc=0060FEE0

  &sc[0]=0060FEE0

  sc+1=0060FEF0

  sc+2=0060FF00

  程序分析:

  1) 本例中定義的二維數(shù)組為 3 行 4 列,含 3 個(gè)學(xué)生對(duì)象,對(duì)應(yīng) 3 行,每個(gè)學(xué)生對(duì)象包括 4 個(gè)屬性,對(duì)應(yīng) 4 列。

  2) 二維數(shù)組名 sc 相當(dāng)于首對(duì)象即第一個(gè)學(xué)生 sc[0] 的地址,即 sc==&sc[0]。輸出地址一般使用格式控制符 %p 或 %x 或 %08x。由某次運(yùn)行結(jié)果可知,sc 和 &sc[0] 的值均為十六進(jìn)制數(shù) 0060FEE0。

  由此可得:二維數(shù)組名為首對(duì)象或首行的地址。

  3) 二維數(shù)組名加 1 表示跳過(guò)一個(gè)對(duì)象(一行)的空間,為下一個(gè)對(duì)象(下一行)的地址。即跳過(guò)一個(gè)對(duì)象所有屬性(一行中所有列元素)對(duì)應(yīng)的空間,到達(dá)下一個(gè)對(duì)象(下一行)的起始位置。

  而本例中一個(gè)對(duì)象有 4 個(gè)屬性,每個(gè)屬性均為整型變量,在 VC++6.0 中占 4 字節(jié),故一個(gè)對(duì)象(一行)共占 4X4=16 個(gè)字節(jié)。故 sc、sc+1、sc+2 均相差 16 個(gè)字節(jié),轉(zhuǎn)換為十六進(jìn)制為 0x10。如運(yùn)行結(jié)果所示。

  4) 程序每次運(yùn)行為某變量空間分配的起始地址可能有差別。

  二維數(shù)組的引用

  二維數(shù)組的引用格式為:

  數(shù)組名[行下標(biāo)][列下標(biāo)];

  注意引用數(shù)組元素時(shí)不能加類型,行下標(biāo)、列下標(biāo)均從 0 開始。且行下標(biāo)和列下標(biāo)的形式可以為常量、變量或表達(dá)式。

  若 M 和 N 均為已定義的正整數(shù):

  int i,j; //i和j分別表示行下標(biāo)和列下標(biāo).int a[M][N]; //定義了一個(gè)M行N列的二維整型數(shù)組a

  行下標(biāo)i的范圍為 0?M-1。

  列下標(biāo)j的范圍為 0?N-1。

  稱第幾個(gè)時(shí),習(xí)慣上是從第 1 個(gè)開始,第 2 個(gè),第 3 個(gè),…,而不從第 0 個(gè)開始。但是二維數(shù)組的行下標(biāo)及列下標(biāo)均是從 0 開始的,為統(tǒng)一起見,本書中對(duì)數(shù)組元素的引用,采用行列序號(hào)來(lái)描述,如 a[i][j] 為 i 行 j 列元素,而不說(shuō)成第 i 行第 j 列元素。例如:

  int a[3][4];a[0][0]; //為0行0列元素a[2][1]; //為2行1列元素a[1][1+2]; //為1行3列元素

  例如:

  int n=4, i, j ;int a[3][4]; //定義了一個(gè)3行4列的二維數(shù)組a

  對(duì)該數(shù)組的引用形式為 a[i][j],其中,行下標(biāo) i 的范圍為 0?2,列下標(biāo) j 的范圍為 0?3。以下對(duì)該二維數(shù)組的引用均是正確的。

  a[2][n-1]=a[0][1+1] +a[2][2-1]; //a[0][2]、a[2][1]相加后賦給a[2][3]a[3-1][n-1];//引用2行3列元素

  以下對(duì)該二維數(shù)組的引用形式是錯(cuò)誤的。

  a[-2][1]; //行下標(biāo)-2越界,應(yīng)為0?2a[3][2]; //行下標(biāo)3越界,應(yīng)為0?2a[2][n]; //列下標(biāo)n=4越界,應(yīng)為0?3a[2,3]; //引用形式錯(cuò)誤,應(yīng)為a[2][3]a[2][]; //缺少列下標(biāo)int a[1][n-2]; //引用不能加類型,若為定義,第二維含有變量n,錯(cuò)誤

  【例 2】定義一個(gè) 2 行 3 列的二維數(shù)組,從鍵盤上輸入 6 個(gè)數(shù)值,依次給該二維數(shù)組的每個(gè)元素賦值,按每行三個(gè)元素輸出該二維數(shù)組及所有元素的和。

  程序分析:

  例題涉及對(duì)二維數(shù)組的賦值,一般使用雙重循環(huán),外層循環(huán)控制行下標(biāo),內(nèi)層循環(huán)控制列下標(biāo)。二維數(shù)組的每個(gè)元素 a[i][j] 像普通變量一樣使用,使用 scanf 函數(shù)輸入時(shí),一定要加 &。輸入時(shí),可以輸入完 6 個(gè)數(shù)據(jù)后按一次回車鍵。

  本題要求每輸出一行后換行,即輸出完一行中的所有列數(shù)據(jù)(內(nèi)層循環(huán)結(jié)束)后換行。

  實(shí)現(xiàn)代碼:

  #includeint main (void){ int a[2][3]; //先定義,后賦值 int i,j,s=0; printf("Input 6 integers:"); for(i=0;i<2;i++) { for (j=0; j<3; j++) { scanf ("%d",&a[i][j]); //勿忘 & s+=a[i][j] ; //與上一條語(yǔ)句不能顛倒 } } for(i=0;i<2;i++) { for (j=0; j<3; j++) printf("%d\t",a[i][j]); //使用\t 的作用 printf ("\n"); //注意該輸出換行符的位置 } printf("s=%d\n", s); return 0;}   運(yùn)行結(jié)果為:   Input 6 integers:1 2 3 4 5 6   1 2 3   4 5 6   s=21   二維數(shù)組的初始化

  二維數(shù)組可以先定義,后賦值,在顯式賦值之前,二維數(shù)組的各數(shù)據(jù)元素是隨機(jī)值。也可以在定義二維數(shù)組的同時(shí),采用初始化列表的形式對(duì)其元素賦初值,稱為二維數(shù)組的初始化。

  二維數(shù)組的初始化方式通常有以下幾種。

  1) 分行給出初始化數(shù)據(jù),且每行的初始化數(shù)據(jù)個(gè)數(shù)等于列數(shù)。例如:

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

  該初始化列表給出了兩行數(shù)據(jù),每一行數(shù)據(jù)用一對(duì)大括號(hào) {} 括起來(lái),一行中的數(shù)據(jù)及行與行之間均用逗號(hào)隔開。這是一種較常用的二維數(shù)組的初始化方式。

  該初始化語(yǔ)句相當(dāng)于如下 6 條賦值語(yǔ)句。

  a[0][0]=1; a[0][1]=2; a[0][2]=3;a[1][0]=4; a[1][1]=5; a[1][2]=6;

  由于初始化列表中明確給出了兩行數(shù)據(jù),故定義該數(shù)組時(shí),其第一維的大小可省略,編譯器能間接算出該數(shù)組的行數(shù)為 2,故依然可以確定其空間大小,因此,在對(duì)二維數(shù)組進(jìn)行初始化時(shí),其第一維的大小可以省略,即寫成如下形式:

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

  注意:第二維的大小一定不能省略!如下初始化均是錯(cuò)誤的。

  int a[2][] = {{l,2,3},{4,5,6}}; //錯(cuò)誤。不能省略第二維大小int a[][] = {{l,2,3}, {4,5,6}}; //錯(cuò)誤。不能省略第二維大小int a[][3]; //錯(cuò)誤。沒(méi)有提供初始化列表時(shí),兩維的大小都必須顯式給出int a[2][3] = {{l,2,3},{4,5,6},{7,8,9}}; //錯(cuò)誤。初始行數(shù)多于數(shù)組行數(shù)

  如果把上面一條初始化語(yǔ)句改為省略第一維的大小,便是正確的,即:

  int a[][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; //正確。間接得知該數(shù)組為三行

  2) 分行給出初始化數(shù)據(jù),但每行的初始化數(shù)據(jù)個(gè)數(shù)少于列數(shù)。例如:

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

  該初始化列表給出了兩行數(shù)據(jù),第一行給出兩個(gè)數(shù)據(jù),少一個(gè),對(duì) int 型默認(rèn)為補(bǔ) 0;第二行僅給出一個(gè)數(shù)據(jù),少兩個(gè),補(bǔ)兩個(gè) 0。所以上述初始化語(yǔ)句相當(dāng)于:

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

  同理:

  int a[][3]={{0},{0}};

  相當(dāng)于:

  int a[][3] = {{0,0,0},{0,0,0}}; //2行3列

  3) 初始化數(shù)據(jù)沒(méi)有分行,容易產(chǎn)生混亂,不推薦這種方式。

  如果初始化數(shù)據(jù)的個(gè)數(shù)是列數(shù)的整數(shù)倍,即:

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

  初始化數(shù)據(jù)以列數(shù)三個(gè)為一組,共分為兩組,且每組數(shù)據(jù)個(gè)數(shù)恰好等于列數(shù) 3,故第一組賦值給第 1 行,第二組賦值給第 2 行。初始化后,數(shù)組中各元素為:

  1 2 3

  4 5 6

  例如:

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

  由于該二維數(shù)組列數(shù)為 3,初始化數(shù)據(jù)以三個(gè)為一組,共分為兩組,但第二組僅一個(gè)數(shù)據(jù),少于列數(shù) 3,對(duì) int 型數(shù)組用 0 補(bǔ)齊。故第一組數(shù)據(jù) 1,2,3 賦值給第一行,第二組補(bǔ)齊為三個(gè)數(shù)據(jù) 4,0,0 后,賦值給第二行。相當(dāng)于 int a[][3]={1,2,3,4,0,0}; 初始化后, 數(shù)組中各元素為:

  1 2 3

  4 0 0

  int a[][3] = {1,2,3,4,5,6,7,8}; //正確,可間接得知該數(shù)組為三行,不推薦

  第三行不夠三個(gè)數(shù)據(jù),用 0 補(bǔ)齊。故該語(yǔ)句相當(dāng)于:

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

  初始化后,數(shù)組中各元素為:

  1 2 3

  4 5 6

  7 8 0

  如果第一維大小沒(méi)有省略,則初始化數(shù)據(jù)的個(gè)數(shù)一定不能超過(guò)數(shù)組元素的總個(gè)數(shù),否則報(bào)錯(cuò)。例如:

  int a[2][3] = {1,2,3,4,5,6,7,8};//錯(cuò)誤。初始數(shù)據(jù)個(gè)數(shù)8多于數(shù)組總個(gè)數(shù)6

  二維數(shù)組的存儲(chǔ)

  二維數(shù)組在邏輯(表現(xiàn)形式)上可理解為矩陣形式(分行分列),但其物理存儲(chǔ)形式卻是連續(xù)的,即存完第一行,在其后面接著存儲(chǔ)第二行,第三行,…,如無(wú)特殊說(shuō)明,本書中涉及對(duì)二維數(shù)組的表述一般指的是其邏輯形式即矩陣形式。

  二維教組的應(yīng)用舉例

  【例 3】一個(gè)班級(jí)有 N 名學(xué)生,每個(gè)學(xué)生有 4 門課程(語(yǔ)文、數(shù)學(xué)、外語(yǔ)、C 語(yǔ)言),計(jì)算每個(gè)學(xué)生的平均分。編寫程序?qū)崿F(xiàn)該功能需求。

  問(wèn)題分析:該問(wèn)題可把每個(gè)學(xué)生當(dāng)成一個(gè)對(duì)象,而每個(gè)對(duì)象(學(xué)生)有 5 個(gè)屬性:4 門課程成績(jī)及平均分。故該問(wèn)題可使用二維數(shù)組來(lái)處理數(shù)據(jù),該二維數(shù)組含有 N 個(gè)對(duì)象,故第一維的大小為 N,每個(gè)對(duì)象有 5 個(gè)屬性,故第二維的大小為 5。為便于驗(yàn)證,本例中學(xué)生個(gè)數(shù) N 設(shè)為 3 個(gè)。

  實(shí)現(xiàn)代碼:

  #include#define N 3int main (void){ float a[N][5],sum; //sum用來(lái)累加每個(gè)學(xué)生4門課的總成績(jī) int i, j ; printf ("輸入%d個(gè)學(xué)生信息(語(yǔ)、數(shù)、外、C語(yǔ)言成績(jī)):\n",N); for(i=0;i

  運(yùn)行結(jié)果為:

  輸入3個(gè)學(xué)生信息(語(yǔ)、數(shù)、外、C語(yǔ)言成績(jī)):

  NO1:82 91 88 93

  NO2:83 84 80 91

  NO3:73 79 86 81

  學(xué)號(hào) 語(yǔ)文 數(shù)學(xué) 外語(yǔ) C語(yǔ)言 平均成績(jī)

  NO1: 82.0 91.0 88.0 93.0 88.5

  NO2: 83.0 84.0 80.0 91.0 84.5

  NO3: 73.0 79.0 86.0 81.0 79.8

“C語(yǔ)言二維數(shù)組是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI