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] 指的是同一個位置。(這將在下一章中詳細解釋。)

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
這個標準字串庫將允許對字串執行各種任務,將在 字串 章節中進行討論。
- ↑ Pádraig Brady. "C 和 C++ 筆記".
- ↑ C 程式設計/指標和陣列
- ↑ MINC/參考/MINC1-volumeio-程式設計師參考