跳到內容

C 程式設計/陣列和字串

來自華夏公益教科書

C 語言中的陣列用於在單個變數名下儲存相關資料,並使用索引(也稱為下標)。最簡單地將陣列視為相同型別變數的列表或有序分組。因此,陣列通常有助於程式設計師有效且直觀地組織資料集合。

稍後我們將考慮指向的概念,這是 C 語言的基礎,它擴充套件了陣列的性質(陣列可以被稱為常量指標)。目前,我們將只考慮它們的宣告和用法。

C 語言中的陣列以以下形式宣告

type name[number of elements];

例如,如果我們想要一個包含六個整數(或整數)的陣列,我們在 C 語言中編寫

int numbers[6];

對於一個名為 letters 的六個字元陣列,

char letters[6];

等等。

你也可以在宣告時初始化。只需將初始元素放在花括號中,用逗號隔開,作為初始值

type name[number of elements]={comma-separated values}

例如,如果我們想用六個整數初始化一個數組,其中0, 0, 1, 0, 0, 0作為初始值

int point[6]={0,0,1,0,0,0};

雖然在這種情況下的初始化時,陣列維度可以省略,並且陣列將自動調整大小以容納初始資料

int point[]={0,0,1,0,0,0};

這非常有用,因為陣列的大小可以透過簡單地新增或刪除初始化元素來控制,而無需調整維度。

如果指定了維度,但未初始化陣列中的所有元素,則剩餘元素將包含值為 0。這非常有用,尤其是在我們有非常大的陣列時。

int numbers[2000]={245};

上面的例子將陣列的第一個值設定為 245,其餘設定為 0。

如果我們想訪問儲存在陣列中的變數,例如上面的宣告,以下程式碼將把 1 儲存在變數中x

int x;
x = point[2];

C 語言中的陣列從 0 開始索引,而不是從 1 開始索引。上面陣列的第一個元素是point[0]. 陣列中最後一個值的索引是陣列大小減一。在上面的例子中,下標從 0 到 5。C 語言不保證對陣列訪問進行邊界檢查。編譯器可能不會抱怨以下情況(儘管最好的編譯器會這樣做)

char y;
int z = 9;
char point[6] = { 1, 2, 3, 4, 5, 6 };
//examples of accessing outside the array. A compile error is not always raised
y = point[15];
y = point[-4];
y = point[z];

在程式執行期間,陣列越界訪問並不總是會導致執行時錯誤。你的程式可能會在從 point[-1] 中檢索到值後繼續執行。為了緩解索引問題,sizeof() 表示式通常在編寫處理陣列的迴圈時使用。

許多人使用一個宏,它反過來使用 sizeof() 來查詢陣列中的元素數量,這個宏被各種命名為 "lengthof()"、[1] "MY_ARRAY_SIZE()" 或 "NUM_ELEM()"、[2] "SIZEOF_STATIC_ARRAY()"、[3] 等。

int ix;
short anArray[]= { 3, 6, 9, 12, 15 };
 
for (ix=0; ix< (sizeof(anArray)/sizeof(short)); ++ix) {
  DoSomethingWith("%d", anArray[ix] );
}

請注意,在上面的例子中,陣列的大小沒有顯式指定。編譯器知道將其大小設定為 5,因為初始化列表中有五個值。在列表中新增一個額外的值將導致它被設定為 6,並且由於在for迴圈中使用了 sizeof 表示式,程式碼會自動調整以適應此變化。良好的程式設計習慣是宣告一個名為 size 的變數,並在其中儲存陣列中的元素數量。

size = sizeof(anArray)/sizeof(short)

C 語言還支援多維陣列(或者更確切地說,陣列的陣列)。最簡單的型別是二維陣列。這將建立一個矩形陣列 - 每行都有相同數量的列。為了在 C 語言中建立一個具有 3 行 5 列的字元陣列,我們寫

char two_d[3][5];

要訪問/修改此陣列中的值,我們需要兩個下標

char ch;
ch = two_d[2][4];

two_d[0][0] = 'x';

類似地,多維陣列可以像這樣初始化

int two_d[2][3] = {{ 5, 2, 1 },
                   { 6, 7, 8 }};

列數必須顯式宣告;但是,編譯器將根據初始化列表找到適當的行數。

還有一些可能的奇怪表示法

int a[100];
int i = 0;
if (a[i]==i[a])
{
  printf("Hello world!\n");
}

a[i] 和 i[a] 指的是同一個位置。(這將在下一章中詳細解釋。)

儲存在記憶體中的字串 "Merkkijono"

C 語言沒有內建的字串處理功能;因此,字串被定義為字元陣列。C 語言允許用字元陣列來表示字元字串而不是字元列表,並在末尾自動新增空終止符。例如,要儲存字串 "Merkkijono",我們會寫

char string[11] = "Merkkijono";

char string[11] = {'M', 'e', 'r', 'k', 'k', 'i', 'j', 'o', 'n', 'o', '\0'};

在第一個例子中,字串將由編譯器在末尾自動新增一個空字元;按照慣例,庫函式期望字串以空字元結尾。後面的宣告表示單個元素,因此需要手動新增空終止符。

字串並不總是必須與顯式變數相關聯。正如你已經看到的那樣,可以直接建立一個字元字串,作為直接使用的無名字串(如 printf 函式)。

要建立一個很長的字串,你必須將字串分成多個部分,用引號結束第一個部分,並在下一行重新開始字串(也用引號開頭和結尾)

char string[58] = "This is a very, very long "
                "string that requires two lines.";

雖然字串也可以透過在行尾加上反斜槓來跨越多行,但這種方法已過時。

有一個有用的字串處理例程庫,你可以透過包含另一個頭檔案來使用它。

#include <string.h>  //new header file

這個標準字串庫將允許對字串執行各種任務,將在 字串 章節中進行討論。

參考資料

[編輯 | 編輯原始碼]


華夏公益教科書