C++二維數組講解、二維數組的聲明和初始化


 

我們知道,一維空間是一條線,數學中用一條數軸來表達;二維空間是一個平面,數學中用平面坐標系來表達。那么二維數組又是什么樣的呢?

線與面

我們用一個下標來描述一維數組中的某個元素,就好像在用數描述一條線上的點。而所有的數據都是存儲在一條線上。如果我們采用兩個下標,就能形成一個平面,猶如一張表格,有行有列,所有的數據就能夠存放到表格里。

我們把二維數組的兩個下標分別稱為行下標和列下標,在前面的是行下標,在后面的是列下標。

那么什么時候要用二維數組呢?一般有兩種情況,一種是描述一個二維的事物。比如用1表示牆,用0表示通路,我們可以用二維數組來描述一個迷宮地圖;用1表示有通路,0表示沒有通路,我們可以用二維數組來描述幾個城市之間的交通情況。還有一種是描述多個具有多項屬性的事物。比如有多個學生,每個學生有語文、數學和英語三門成績,我們就可以用二維數組來描述。

對於第二種情況,我們要注意各項屬性應該是同一種數據類型,比如三種學科的成績都是整數。如果出現了姓名(字符串屬性),就不能將他們組合到一個二維數組里去。所以不要企圖將不同數據類型的屬性整合到一個二維數組中去。

二維數組的聲明和初始化

二維數組的聲明和一維數組是類似的,不同之處只是多了一個下標:
    數據類型數組名[行數][列數];

要注意,二維數組的下標也都是從0開始的。

二維數組的初始化分為兩種,一種是順序初始化,一種是按行初始化,我們來看一段程序,就能夠對它們有所了解了:(程序7.4.1)
#include "iostream.h"
#include "iomanip.h"
int main()
{
   int array1[3][2]={4,2,5,6};//順序初始化
   int array2[3][2]={{4,2},{5},{6}};//按行初始化
   cout <<"array1" <<endl;
   for (int i=0;i<3;i++)//輸出數組array1
   {
      for (int j=0;j<2;j++)
     {
         cout <<setw(2) <<array1[i][j];
      }
      cout <<endl;
   }
   cout <<"array2" <<endl;
   for (int k=0;k<3;k++)//輸出數組array2
   {
      for (int l=0;l<2;l++)
      {
         cout <<setw(2) <<array2[k][l];
      }
      cout <<endl;
   }
   return 0;
}

運行結果:
array1
4 2
5 6
13 4
array2
4 2
5 8
6 8

我們可以看出,所謂按順序初始化就是先從左向右再由上而下地初始化,即第一行所有元素都初始化好以后再對第二行初始化。而按行初始化則是用一對大括號來表示每一行,跳過前一行沒有初始化的元素,在行內從左向右地進行初始化。對於沒有初始化的元素,則都是一個不確定的值。

省略第一維的大小

我們在第一節學到,一維數組的大小可以省略。可是二維數組的元素個數是行數和列數的乘積,如果我們只告訴電腦元素個數,電腦無法知道究竟這個數組是幾行幾列。所以,C++規定,在聲明和初始化一個二維數組時,只有第一維(行數)可以省略。比如:
    int array[][3]={1,2,3,4,5,6};
相當於:
    int array[2][3]={1,2,3,4,5,6};

二維數組在內存中的存儲情況

先前已經說明,內存是依靠地址來確定內存中的唯一一個存儲單元的,即只有一個參數。所以在內存中,所有的數據都是像一維數組那樣順序存儲的。那么具有兩個下標的二維數組是怎樣存放到內存中的呢?

在內存中,先將二維數組的第一行按順序存儲,接着就是第二行的數據,然后是第三行的數據……右圖(圖7.4)所示的就是一個二維數組在內存中的存儲情況。

向函數傳遞二維數組

我們知道,數組作為參數傳遞給函數的是數組首元素的地址。對於二維數組來說亦是如此。不過有兩個問題,一個是我們必須讓函數知道行數和列數,這就像我們要讓函數知道一維數組的大小一樣,防止發生越界訪問。另一個就是我們必須讓電腦知道這個二維數組是怎樣的一個表格,即必須告知數組的列數。這和只能省略二維數組的行數道理是一樣的。下面我們就來看一個向函數傳遞二維數組的程序:
#include "iostream.h"
#include "iomanip.h"
void disp(int a[][2],int r,int c);//告知數組的列數
int main()
{
   int array[3][2]={4,2,5,6,3,1};
   cout <<"array" <<endl;
   disp(array,3,2);
   return 0;
}
void disp(int a[][2],int r,int c)
{
   for (int i=0;i<r;i++)
   {
      for (int j=0;j<c;j++)
      {
         cout <<setw(2) <<a[i][j];
      }
      cout <<endl;
   }
}

運行結果:
array
4 2
5 6
3 1

二維數組轉化成一維數組

有些時候,我們覺得用二維數組來描述一樣事物很方便。比如我們用二維數組來畫一個迷宮地圖,行下標和列下標就如同直角坐標系一樣。可是在某些情況下,不能使用二維數組,或者難以制造一個二維數組。二維數組在內存中的存儲情況和一維數組是相同的,所以我們只好用一個一維數組來代替它了。

於是,我們不難總結出一個結果,一個二維數組元素a[x][y]在一維數組b中,是:
    a[x][y]=b[x*列數+y]
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM