HOME ABOUT CONTACT

C/C++教學: 第二十二課 - 結構陣列(Struct Array)

Rain October 12, 2024
Outline

1. 簡介

2. 建立鏈結串列(靜態配置連接)

3. 建立鏈結串列(動態配置連接)

簡介top

在介紹完鏈結串列(Linked List)之後,接著我們再來看看什麼是結構陣列(Struct Array)。現在我們有一大筆的資料要儲存,就目前為止,難道就只有動態配置的方式將它們串在一起才能組成一個更大的集合嗎?

答案並不是的,我們當然可以用靜態配置的方式來儲存大筆數據,只是在前面篇章所要強調的是,靜態配置和動態配置的優缺點有哪些,而動態配置的鏈結串列介紹完了,現在要來介紹靜態配置的結構陣列(Struct Array)。

一樣我們先來看看結構陣列的簡圖,如下:

我們在結構定義裡的成員中,我們已經不需要結構指標來輔助我們去找下一個結構,因為陣列的特性就是連續性的記憶體空間,因此我們一樣可以直接用索引(Index)就可以去找到任何一個結構。

指標結構宣告語法top

陣列(Array)篇章中,我們有提到陣列是向系統要求了一塊連續的記憶體,而這空間可以存放變數、或結構、或物件。

因此在宣告語法的部分,其實和陣列篇章提及的沒什麼不一樣,只需要在資料型態的部分改成我們定義好的結構即可,如下:


struct node {
    int val;
};

int main()
{
    const int size = 10;
    struct node list[size];
                            
    return 0;
}
                        

在宣告的環節,我們一樣需要給定一個大小(Size),上例中我們給定了需要存放 10 個結構的陣列。宣告陣列的語句與其他陣列一樣,只需要把資料型態更改成 struct node 即可。

那麼我們再來看看如何使用這個結構陣列丟給一個函式去做初始值的設定,並且將設定結果一一輸出,如下:


void initialize(struct node* n, const int size)
{
    for (int i = 0; i < size; i++) {
        n[i].val = 10;
    }
}
                            
int main()
{
    const int size = 10;
    struct node list[size];

    initialize(&list[0], size);

    for (int i = 0; i < size; i++) {
        std::cout << "val = " << list[i].val << std::endl;
    }
    return 0;
}
                        

上例中,我們定義了一個函式名為 initialize,用它來幫我們將宣告的結構陣列附上初始值。在函式參數的部分你可以看到,我們使用的是傳址呼叫(Call by Address)的方式取得結構陣列的起始位址,讓函式可以有一個指標用索引值去走訪整個陣列(連續記憶體的特點)。

初始值配置完成並回到主函式(main)之後,一樣我們可以用索引值去走訪並輸出全部結構內的值(val)。在這裡我們可以思考一下,如果 initialize 函式的參數要改成傳參呼叫(Call by Reference)可以怎麼寫呢? 如下:


void initialize(struct node &n, const int size)
{
    for (int i = 0; i < size; i++) {
        (&n)[i].val = 10;
    }
}
                            
int main()
{
    const int size = 10;
    struct node list[size];

    initialize(list[0], size);

    for (int i = 0; i < size; i++) {
        std::cout << "val = " << list[i].val << std::endl;
    }
    return 0;
}
                        

如果這個問題你已經可以理解,代表指標的概念已有不錯的認知。若不是很清楚的讀者們也不要氣餒,因為指標對於初學者來說確實不容易理解,這裡我們來一步一步理解它。

首先函式的參數我們已經定義成傳參呼叫(Call by Reference),它代表函式可以直接拿到這個記憶體位址的資料,這裡你可以把它視為跟一般的變數一樣,然而在配置值的時候,我們無法直接用"[index]"的方式去走訪,這是因為只有指標型態才能用這樣的表示法(可回顧動態記憶體配置指標走訪的環節有提到),所以為了讓資料值再轉成指標型態,因此我們直接用一個取址符號做轉換,並且用括號括住使它取址的動作被優先操作。

這個環節建議多做練習和嘗試,因為指標在後續會越來越常出現和活用,因此若還不是很清楚指標的應用的讀者可以先緩一緩並多練習一下。

下一篇: 第二十三課 - 共用資料(Union)


Last updated:

Related Artical List

  1. C/C++教學: 第二十課 - 結構指標(Strcut Pointer)
  2. C/C++教學: 第二十一課 - 鏈結串列(Linked List)
  3. C/C++教學: 第二十三課 - 共用資料(Union)

Article List