陣列與字串速學筆記——從基礎宣告到多維結構的全方位解析
在程式設計中,我們經常需要同時處理一組具有「相同型態」的資料。例如,想要儲存一組學生成績、客戶名稱清單、每日氣溫變化或是大型矩陣運算的資料集,僅使用單一的變數顯然不夠便利。為了在記憶體中有效且有序地儲存、存取與管理這些相關的多筆資料,我們需要「陣列 (array)」。陣列是一種能夠儲存「相同資料型態、多筆資料」的資料結構,它能透過索引 (index)來快速存取元素。C++語言為我們提供了宣告並操作陣列的機制,使程式設計師能更輕鬆地處理龐大且有關聯性的資料集。
更進一步地,C++雖然是功能強大的語言,但它並沒有內建「字串」的基本資料型態。若需要處理文字資訊,通常必須使用「字元陣列 (character array)」來表示字串,這樣的表示法也被稱作 C-Style字串。在本章中,我們將由淺入深地介紹從一維陣列、二維陣列乃至多維陣列的宣告與使用方式,以及如何使用字元陣列來表示字串。最後亦會討論字串陣列的宣告與應用。
5-1 陣列的宣告與使用
一維陣列
一維陣列是最基本的陣列結構。我們可以想像,一維陣列就像是一排有編號的信箱或置物櫃,每個位置能存放一個相同型態的資料。陣列的索引值從0開始遞增,這點對初學者來說要特別注意。
宣告語法:
舉例來說:
以上程式碼表示宣告一個名為 score 的整數陣列,擁有5個元素,分別是 score[0], score[1], score[2], score[3], score[4]。在設定初值時,我們可以利用下列語法直接初始化:
如果初始值個數少於陣列長度,剩下的元素將自動填入0:
如果想讓編譯器自動決定陣列長度,可以省略長度並利用初始值的數量來決定長度:
陣列元素存取和一般變數類似,只是需要使用陣列名稱+索引值的方式存取。例如:
需要特別注意,兩個整數陣列之間不可直接以 = 做整體賦值,只能逐一對元素賦值。
二維陣列
若想儲存需要以列(row)與行(column)表示的資料(例如矩陣、表格),就可以使用二維陣列。
宣告語法:
例如:
可以視 mat為一個3x5的矩陣,其元素從 mat[0][0] 一直到 mat[2][4]。在初始化時,可利用大括號 { } 將每一列的初始值分組:
若初始值不足,未指定的元素將自動為0。也可全部指定為0來初始化整個陣列:
二維陣列在實務上常用於處理表格資料、矩陣計算、圖形像素陣列或學生多科成績存儲等。
多維陣列
C++中可將陣列擴充到三維或更多維度,只要記憶體許可,就可繼續擴大。多維陣列的概念依然是從一維陣列延伸而來。例如一個三維陣列 int arr[2][3][4];可以想像為兩個3x4的二維陣列所組合而成,透過三層巢狀迴圈即可存取其中的所有元素。
宣告四維陣列或更高維度的情況較為少見,通常用在特定的科學計算或複雜資料建模中。一般程式設計中較常使用到一到二維,最多三維。
5-2 字串簡介
C++本身沒有內建字串型態,傳統的做法是利用字元陣列來表示字串,這種方式被稱為 C-Style字串。字串在記憶體中以「字元(char)」為單位存放,每個字串末尾必須有一個空字元 '\0' 來表示字串的結尾,使系統能知道字串長度。
宣告字串的方式:
此時 str是一個字元陣列,包含'H', 'e', 'l', 'l', 'o'以及 '\0' 總共6個字元位置。
也可顯式指定陣列長度:
若未給定初值,則必須指明字串長度:
字串陣列
如果需要同時儲存多個字串,就可使用「字串陣列」,也就是二維字元陣列。
上例中,我們有5個字串,每個字串最長9個字元(最後一個為'\0')。
字串陣列的存取方法與二維陣列類似。例如 names[2] 指向第三個字串 "Nancy",names[2][1] 則是該字串的第二個字元 'a'。
雖然字串陣列使用方便,但由於必須預先訂出最大長度,對於變化性高、長度不固定的字串會造成空間浪費。日後學習C++的標準函式庫 std::string 時,將能更靈活地處理字串。
課後評量與思考
-
若兩個陣列不能直接以
=做整體賦值,那該如何一次複製全部元素?
答:必須利用迴圈逐一將元素從一個陣列拷貝到另一個陣列。 -
在宣告一個字串時,為何結尾必須包含
'\0'字元?
答:因為C-Style字串沒有內建長度資訊,'\0'用來標識字串的終點。 -
當我們宣告多維陣列時,若省略最左邊的維度長度是可以的,但中間或最後的維度一定要指定。為何?
答:因為編譯器需確定內層維度的大小,才能計算記憶體分配位置和各維度指標偏移量。 -
該如何決定要使用一維陣列、二維陣列或更高維度陣列?
答:視資料邏輯結構而定。如果資料像是單行列表可用一維陣列;若是表格、矩陣型態則使用二維陣列;只有在需要更高維度的空間結構(如3D網格資料)時才使用多維陣列。
APCS 檢定考古題精選
- 將多選題與程式碼演算視為實務練習。
- 若遇到位址計算、索引偏移問題,可利用公式加以推導。
- 排錯題中,若陣列初值與條件檢測有誤,需要多次嘗試不同初值組合才能暴露程式漏洞。
題中常出現的概念包括:
- 陣列記憶體位址計算方式(以列為主或以行為主的儲存模式)
- 在多維陣列中切換行列關係
- 在字串結尾處必有 '\0'字元
- 利用巢狀迴圈處理多維陣列的資料運算
- 設計程式時,要注意索引範圍與初值設定
總結
陣列與字串是C/C++程式設計中不可或缺的基礎概念。透過陣列,我們能方便地管理大量且性質相同的資料,提升程式碼的可讀性與可維護性。進而在C語言機制下,我們以字元陣列實作字串,並運用字串陣列管理多組文字資訊。儘管未來有 std::string 和更高階的容器型態來處理複雜資料結構,但理解並精通陣列與字元陣列的底層概念,將讓你在程式設計的道路上打下扎實的基礎,輕鬆面對更為進階的議題。
請先 登入 以發表留言。