數組是一個由若干同類型變量組成的集合,引用這些變量時可用同一名字。數組均由連續的存儲單元組成,最低地址對應于數組的第一個元素,最高地址對應于最后一個元素,數組可以是一維的,也可以是多維的。 一維數組的一般說明形式如下: type-specifiervar_name[size]; 在C語言中,數組必須顯示地說明,以便編譯程序為它們分配內存空間。在上式中,類型說明符指明數組的類型,也就是數組中每一個元素個數,一維數組的總字節數可按下式計算: sizeof(類型)*數組長度=總字節數 [例5-1]將數字0到9裝入一個整型數組。 main() { int x[10];/*定義包含10個整型數的數組,引用為x[0],x[1]...x[9]*/ int t; for(t=0;t<10;++t)x[t]=t; } C語言并不檢驗數組邊界,因此,數組的兩端都有可能越界而使其它變量的數組甚至程序代碼被破壞。在需要的時候,數組的邊界檢驗便是程序員的職責。例如,當使用gets()接收字符輸入時,必須確認字符數組的長度足以存放最長的字符串。 一維數組在本質上是由同類數據構成的表,例如,對下列數組a: char a[7] 圖5-1說明了數組a在內存中的情形,假定起始地址為1000。 5.1.1 向函數傳遞一維數組 將一維數組傳遞給函數時,把數組名作為參數直接調用函數即可,無需任何下標。這樣, 數組的第一個元素的地址將傳遞給該函數。C語言并不是將整個數組作為實參來傳遞,而是用 指針來代替它。例如,下面的程序將數組i的第一個元素的地址傳遞給函數func1( )。 main( ) { int i[10]; func1(i); /*函數調用,實參是數組名* / . . . } 函數若要接收一維數組的傳遞,則可以用下面的二種方法之一來說明形式參數; 1) 有界 數組;2) 無界數組。例如,函數func1 ( )要接收數組i可如下說明: f u n c 1 ( s t r ) char str[10]; /* 有界數組,數組的下標只能小于或等于傳遞數組的大小。* / { . . . } 也可說明為: f u n c 1 ( s t r ) char str[ ]; / * 無界數組* / { . . . } 這二種說明方法的效果是等價的,它們都通知編譯程序建立一個字符指針。第一種說明 使用的是標準的數組說明;后一種說明使用了改進型的數組說明,它只是說明函數將要接收 一個具有一定長度的整型數組。細想就會發現,就函數而言,數組究竟有多長并無關緊要, 因為C語言并不進行數組的邊界檢驗。事實上,就編譯程序而言,下面的說明也是可行的。 func1 (str); int str[32]; { . . . } 因為編譯程序只是產生代碼使函數func1( )接收一個指針,并非真正產生一個包含3 2個元 素的數組。 5.1.2 字符串使用的一維數組 顯然,一維數組的最普通的用法是作為字符串。在C語言中,字符串被定義為一個以空字 符終結的字符數組??兆址浴?/ 0’來標識,它通常是不顯示的。因此,在說明字符數組時, 必須比它要存放的最長字符串多一個字符。例如,假如要定義一個存放長度為1 0的字符串的 數組s,可以寫成: char s[11]; 這樣就給字符串末尾的空字符保留了空間。 盡管C語言并不把字符串定義為一種數據類型,但卻答應使用字符串常量。字符串常量是 由雙引號括起來的字符表。例如,下面兩個短語均為字符串常量: "hello there" "this is a test" 不必向字符串的末尾加空字符, C編譯程序會自動完成這一工作。 C語言支持多串操作函數,最常用的有: 名字功能 strcpy(s1 s2) 將s 2拷貝到s 1 strcat(s1 s2) 將s 2連接到s 1的末尾 s t r l e n ( s 1 ) 返回s 1的長度 s t r c m p ( s 1,s 2 ) 若s 1與s 2相等,返回值為0 若s 1 < s 2,返回值小于0 若s 1 > s 2,返回值大于0 例5 - 2說明了這些函數的用法。 [例5 - 2 ] # include <stdio.h> main ( ) { char s1[80],s2[80]; /*定義字符數組* / gets (s1); /*輸入字符串* / gets (s2); PRintf ("lengthsf: %d %d /,n"st r l e n ( s 1 ) ,st r l e n ( s 2 ) ) ; if (!strcmp(s1,s2)) printf ("the strings are equal /n"); s t r c a t ( s 1 ,s 2 ) ; printf ("%s/n",s 1 ) ; } 切記,當兩個串相等時,函數strcmp( )將返回Fa l s e,因而當測試串的等價性時,要像前 例中的那樣,必須用邏輯運算符!將測試條件取反。 當程序運行并以“h e l l o”和“h e l l o”這兩個串作為輸入時,其輸出為: R U N h e l l o h e l l o lengths:5 5 The strings are equal h e l l o h e l l o