發新話題

C++ Gossip 進階型態 - 一維陣列

C++ Gossip 進階型態 - 一維陣列

您現在要整理全班的程式設計小考成績,您希望寫個小程式,全班共有40名學生,所以您必須有40個變數來儲存學生的成績,現在問題來了,根據之前學過的,難道您要宣告40個名稱不同的變數來儲存學生的成績資料嗎?

當然您知道不會這麼麻煩的,C++提供「陣列」(Array)讓您可以宣告一個以「索引」(index)作為識別的資料結構,宣告陣列的方式如下:
資料型態名稱[大小];


資料型態可以是int、float、char等等之前所學過的資料型態宣告,以下是幾個宣告的範例:
int iarr[10];    // 宣告10個元素的整數Array
double darr[10];    // 宣告10個元素的浮點數Array
char carr[10];    // 宣告10個元素的字元Array


這是靜態陣列的宣告方式,陣列長度必須事先決定,所以您不可以使用變數來事後決定陣列的長度,如果您要動態宣告陣列長度,可以使用一些資料結構與動態記憶體宣告來解決陣列大小必須固定的問題,這在之後才會說明。

宣告陣列之後,陣列所配置到的記憶體空間中所儲存的數是未知的,所以在初始陣列元素值之前,當中的元素值是未知的,如果您在宣告變數時尚未決定陣列中的值,可以這麼宣告陣列:

int irr[10] = {0};
double darr[10] = {0.0};
char carr[10] = {'\0'};
bool barr[10] = {false};


上面的幾個宣告,整數陣列中的元素都會被初始為0,浮點數陣列則會被初始為0.0,字元陣列則會被初始為空字元('\0'),而boolean數陣列則會被初始為false,在宣告陣列時初始陣列元素,可以避免其它的程式存取到非預期的數值。

您也可以在宣告陣列時初始所有的陣列值,例如:

int iarr[5] = {0, 1, 2, 3, 4};
double darr[5] = {0.0, 0.1, 0.2, 0.3, 0.4};
char carr[5] = {'A', 'B', 'C', 'D', 'E'};
bool barr[5] = {false, true, false, true, false};


當要存取陣列中的值時,可以使用下標(Subscript)運算子[ ] 加上「索引」(Index)指定要存取的陣列元素,C++的索引值一律由0開始,而不是由1開始,這點初學者必須特別注意,下面這個簡單的程式可以告訴您如何使用索引存取陣列元素:

#include <iostream>
using namespace std;

int main() {
    const int length = 10;
    int iarr[length] = {0};

    for(int i = 0; i < length; i++)
        cout << iarr << " ";
    cout << endl;

    for(int i = 0; i < length; i++)
        iarr = i;

    for(int i = 0; i < length; i++)
        cout << iarr << " ";
    cout << endl;
   
    return 0;
}
執行結果:
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
由於陣列本身並不知道自己的長度資訊,所以您必須額外記錄陣列長度,就如程式中的length的作用。

C++中陣列的索引值由0開始並不是沒有原因的,事實上陣列名稱就指向陣列記憶體的第一個位置的位址,而索引值表示所指定的陣列元素相對於陣列第一個記憶體位置的位移量(Offset),位移的量與資料型態長度有關,如果是int整數,則每次位移時是一個int整數的長度,例如在上例中iarr[0]索引值為0,所以表示位移量為0,自然就是指第一個元素,而iarr[9]就是指相對於第一個元素的位移量為9,C++就是根據陣列第一個元素的記憶體位置與位移量來得到所指定要存取的陣列元素。

如果您在宣告陣列時只希望初始幾個元素,則可以這麼宣告:

int iarr[5] = {0, 1};
double darr[5] = {0.0, 0.1};
char carr[5] = {'A', 'B'};
bool barr[5] = {false, true};


像上例中,都只初始索引0與索引1的兩個元素,其它未初始的元素,整數的話會自動初始為0,浮點數的話會自動初始為0.0,字元的話會自動初始為空字元('\0'),而boolean數的話會自動初始為false。

如果您在宣告陣列時會一併初始所有的元素,則C++允許您不宣告陣列元素大小,它會根據您指定的元素個數自動設定陣列大小,例如:

int iarr[] = {1, 2, 3};
double darr[] = {0.4, 3.2, 1.0, 4.2};
char carr[] = {'A', 'B'};


上面宣告中,iarr[]的元素個數會是3,darr[]的個數會是4,而carr[]的個數會是2。

陣列在使用時,得知陣列長度(元素個數)是必要的,您不可以存取超過陣列長度的記憶體,這會發生無法預期的結果,然而如何得知陣列的長度,您可以使用 sizeof()運算子,例如:

int iarr[] = {1, 2, 3, 4, 5, 6};
cout << "Array長度:"
         << (sizeof(iarr) / sizeof(iarr[0]))
         << endl;


這個例子會顯示陣列的長度為5;sizeof()會傳回變數所指向的記憶體空間所佔大小,您只要取得整個陣列的記憶體空間大小,再除以一個陣列元素的大小,就可以如上取得陣列的長度了。

您不可以將陣列直接指定給另一個陣列,或是直接比較兩個陣列是否相同,例如:
int arr1[5];
int arr2[5];
...
arr1 = arr2; // 錯誤!不能直接指定陣列給另一個陣列
...
if(arr1 == arr2) { // 錯誤!不能直接比較兩個陣列是否相同
    ...
}


如果要將陣列指定給另一個陣列,您只能循序一個一個元素進行複製,例如:
const int length = 5;
int arr1[length];
int arr2[length];
...
for(int i = 0; i < length; i++) {
    arr1 = arr2;
}


同樣的,如果想比較兩個陣列元素內容是否相同,也要用一個個元素進行比對。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。