陣列與字串速學筆記——從基礎宣告到多維結構的全方位解析

在程式設計中,我們經常需要同時處理一組具有「相同型態」的資料。例如,想要儲存一組學生成績、客戶名稱清單、每日氣溫變化或是大型矩陣運算的資料集,僅使用單一的變數顯然不夠便利。為了在記憶體中有效且有序地儲存、存取與管理這些相關的多筆資料,我們需要「陣列 (array)」。陣列是一種能夠儲存「相同資料型態、多筆資料」的資料結構,它能透過索引 (index)來快速存取元素。C++語言為我們提供了宣告並操作陣列的機制,使程式設計師能更輕鬆地處理龐大且有關聯性的資料集。

更進一步地,C++雖然是功能強大的語言,但它並沒有內建「字串」的基本資料型態。若需要處理文字資訊,通常必須使用「字元陣列 (character array)」來表示字串,這樣的表示法也被稱作 C-Style字串。在本章中,我們將由淺入深地介紹從一維陣列、二維陣列乃至多維陣列的宣告與使用方式,以及如何使用字元陣列來表示字串。最後亦會討論字串陣列的宣告與應用。


5-1 陣列的宣告與使用

一維陣列

一維陣列是最基本的陣列結構。我們可以想像,一維陣列就像是一排有編號的信箱或置物櫃,每個位置能存放一個相同型態的資料。陣列的索引值從0開始遞增,這點對初學者來說要特別注意。

宣告語法:

 
cpp
資料型態 陣列名稱[陣列長度];

舉例來說:

 
cpp
int score[5];

以上程式碼表示宣告一個名為 score 的整數陣列,擁有5個元素,分別是 score[0], score[1], score[2], score[3], score[4]。在設定初值時,我們可以利用下列語法直接初始化:

 
cpp
int arr[5] = {10, 20, 30, 40, 50};

如果初始值個數少於陣列長度,剩下的元素將自動填入0:

 
cpp
int arr[5] = {10, 20}; // arr[2], arr[3], arr[4]自動為0

如果想讓編譯器自動決定陣列長度,可以省略長度並利用初始值的數量來決定長度:

 
cpp
int arr[] = {1, 2, 3}; // arr大小自動為3

陣列元素存取和一般變數類似,只是需要使用陣列名稱+索引值的方式存取。例如:

 
cpp
score[0] = 65; score[1] = 80; int sum = score[0] + score[1]; // sum = 145

需要特別注意,兩個整數陣列之間不可直接以 = 做整體賦值,只能逐一對元素賦值。


二維陣列

若想儲存需要以列(row)與行(column)表示的資料(例如矩陣、表格),就可以使用二維陣列。

宣告語法:

 
cpp
資料型態 陣列名稱[列的個數][行的個數];

例如:

 
cpp
int mat[3][5]; // 3列5行,共15個整數元素

可以視 mat為一個3x5的矩陣,其元素從 mat[0][0] 一直到 mat[2][4]。在初始化時,可利用大括號 { } 將每一列的初始值分組:

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

若初始值不足,未指定的元素將自動為0。也可全部指定為0來初始化整個陣列:

 
cpp
int B[2][5] = {0}; // 所有元素皆為0

二維陣列在實務上常用於處理表格資料、矩陣計算、圖形像素陣列或學生多科成績存儲等。


多維陣列

C++中可將陣列擴充到三維或更多維度,只要記憶體許可,就可繼續擴大。多維陣列的概念依然是從一維陣列延伸而來。例如一個三維陣列 int arr[2][3][4];可以想像為兩個3x4的二維陣列所組合而成,透過三層巢狀迴圈即可存取其中的所有元素。

宣告四維陣列或更高維度的情況較為少見,通常用在特定的科學計算或複雜資料建模中。一般程式設計中較常使用到一到二維,最多三維。


5-2 字串簡介

C++本身沒有內建字串型態,傳統的做法是利用字元陣列來表示字串,這種方式被稱為 C-Style字串。字串在記憶體中以「字元(char)」為單位存放,每個字串末尾必須有一個空字元 '\0' 來表示字串的結尾,使系統能知道字串長度。

宣告字串的方式:

 
cpp
char str[] = "Hello";

此時 str是一個字元陣列,包含'H', 'e', 'l', 'l', 'o'以及 '\0' 總共6個字元位置。

也可顯式指定陣列長度:

 
cpp
char str[6] = "Hello";

若未給定初值,則必須指明字串長度:

 
cpp
char str[20]; // 20個字元空間,但尚未賦值

字串陣列

如果需要同時儲存多個字串,就可使用「字串陣列」,也就是二維字元陣列。

 
cpp
char names[5][10] = { "John", "Mary", "Nancy", "Candy", "Allen" };

上例中,我們有5個字串,每個字串最長9個字元(最後一個為'\0')。

字串陣列的存取方法與二維陣列類似。例如 names[2] 指向第三個字串 "Nancy",names[2][1] 則是該字串的第二個字元 'a'。

雖然字串陣列使用方便,但由於必須預先訂出最大長度,對於變化性高、長度不固定的字串會造成空間浪費。日後學習C++的標準函式庫 std::string 時,將能更靈活地處理字串。


課後評量與思考

  1. 若兩個陣列不能直接以 = 做整體賦值,那該如何一次複製全部元素?
    答:必須利用迴圈逐一將元素從一個陣列拷貝到另一個陣列。

  2. 在宣告一個字串時,為何結尾必須包含 '\0'字元?
    答:因為C-Style字串沒有內建長度資訊,'\0'用來標識字串的終點。

  3. 當我們宣告多維陣列時,若省略最左邊的維度長度是可以的,但中間或最後的維度一定要指定。為何?
    答:因為編譯器需確定內層維度的大小,才能計算記憶體分配位置和各維度指標偏移量。

  4. 該如何決定要使用一維陣列、二維陣列或更高維度陣列?
    答:視資料邏輯結構而定。如果資料像是單行列表可用一維陣列;若是表格、矩陣型態則使用二維陣列;只有在需要更高維度的空間結構(如3D網格資料)時才使用多維陣列。


APCS 檢定考古題精選

  • 將多選題與程式碼演算視為實務練習。
  • 若遇到位址計算、索引偏移問題,可利用公式加以推導。
  • 排錯題中,若陣列初值與條件檢測有誤,需要多次嘗試不同初值組合才能暴露程式漏洞。

題中常出現的概念包括:

  • 陣列記憶體位址計算方式(以列為主或以行為主的儲存模式)
  • 在多維陣列中切換行列關係
  • 在字串結尾處必有 '\0'字元
  • 利用巢狀迴圈處理多維陣列的資料運算
  • 設計程式時,要注意索引範圍與初值設定

總結

陣列與字串是C/C++程式設計中不可或缺的基礎概念。透過陣列,我們能方便地管理大量且性質相同的資料,提升程式碼的可讀性與可維護性。進而在C語言機制下,我們以字元陣列實作字串,並運用字串陣列管理多組文字資訊。儘管未來有 std::string 和更高階的容器型態來處理複雜資料結構,但理解並精通陣列與字元陣列的底層概念,將讓你在程式設計的道路上打下扎實的基礎,輕鬆面對更為進階的議題。

創作者介紹
創作者 AI革命家 REVOLUTIONARY 的頭像
AI革命家

AI革命家 REVOLUTIONARY

AI革命家 發表在 痞客邦 留言(0) 人氣( 3 )