【C++】構造資料型別--陣列

00潤物無聲00發表於2015-03-15

        陣列是一組在記憶體中一次連續存取的,具有同一型別的資料變數所組成的集合體,它在記憶體中佔用一段連續的空間。其中的每個變數成為陣列元素,屬於同一資料型別,陣列元素用陣列名與帶方括號的陣列下標一起標識。談陣列,我們從四個方面談起。陣列的定義,初始化,存取,陣列地址的求得。而陣列可以是一維陣列,二維陣列和多維陣列,我們從最基本的一維陣列說起,其他維陣列通過一維陣列可以推得。

一.一維陣列

1.陣列定義


資料型別相同的簡單變數和陣列可以一起定義。 例如:Int x,a[20]

定義陣列時,還可以用型別定義typedef為陣列型別取一個名字,格式為:

        typedef 資料型別 陣列名[常量表示式];

        typedef int A[5];       //A是一個型別名,陣列型別;

        A  b[5];                    //b是陣列物件;

2.陣列初始化

函式中定義陣列時,沒有初值表,不被初始化,值為隨機值。
函式外定義陣列,沒有初始化,陣列元素值為0
定義陣列,編譯器必須知道陣列的大小,為整個陣列分配適當大小的記憶體,陣列元素個數一定是常量表示式。

3.陣列存取

存取陣列元素

陣列元素(陣列名+下標標識)稱為下標變數,它可以 像簡單變數一樣參與運算。

格式: 陣列名[下標表示式]; 

下標表示式可以使變數表示式,標識陣列元素,不同於定義陣列時確定陣列長度的常量表示式。

        陣列的下標從0開始;

讀取陣列元素地址

4.陣列的地址

陣列記憶體中分配一塊連續的儲存空間,從第一個元素開始依次存放。陣列在記憶體中的排列方式,如圖


        陣列記憶體大小的計算公式為:n*sizeof(元素型別);或者sizeof(陣列名); n為陣列的長度;

        陣列元素的地址通過陣列名來讀取,陣列名是一個地址常量,是陣列在記憶體中的起始地址。

        格式為:陣列名+整形表示式。

        地址不是實際的地址值,只表示了相對於起始地址的位置,稱為符號地址表示式。

                如圖上:a+5 表示陣列中元素a[5]的符號地址。

        實際地址值的求法:陣列的符號地址表示式a+n所表達的地址是第n+1個元素a[n]的地址。

                實際地址值為:a+n*sizeof(資料型別)
5.陣列複製

陣列名是一個地址常量,不能作為被賦值物件。所以不能將一個陣列整體複製給另外一個陣列。

通過for迴圈對應的元素進行復制

        for(i=0;i<5;i++)

              a[i]=c[i]                     //將陣列c中元素的值複製到陣列c的對應元素中

使用Memcpy函式進行記憶體位元組複製,格式為

        Memcpy(目標地址,源地址,位元組數);

        例如:Memcpy(c,a,sizeof(a));            //將陣列a 複製到c中。

二.二維陣列

二維陣列是在一維陣列的基礎上,增加了一維。我們通過一幅圖,看看二維陣列在記憶體中的排列順序。


先順序排列每個一維元素,構成一維陣列;再將各個一維陣列順序排列,構成二維陣列。

        int M[2][3]為例

        先將3個int元素排列組曾兩個一維陣列M[0],M[1]。

                M[0]:M[0][0],M[0][1],M[0][2]

                M[1]:M[1][0],M[1[1],M[1][2]

        再將兩個一維陣列排列成一個二維陣列

                M:M[0],M[1]

總結:

        陣列是一種構造資料型別,表示同一型別資料的集合,在記憶體中連續的存放,陣列名是一個地址常量,陣列的起始地址。陣列接觸了很長時間了,一直感覺複雜,不容易理解,不願意接觸。在C++的學習中,感覺到終於從量變到了質變,對陣列有了新的認識。程式語言的類似性,決定了每一種語言都有同樣的知識,不同的時間,不同的角度,總會明白的。

相關文章