數(shù)組是一個(gè)由若干同類型變量組成的集合,引用這些變量時(shí)可用同一名字。數(shù)組均由連續(xù)的存儲(chǔ)單元組成,最低地址對(duì)應(yīng)于數(shù)組的第一個(gè)元素,地址對(duì)應(yīng)于最后一個(gè)元素,數(shù)組可以是一維的,也可以是多維的。
5.1 一維數(shù)組
一維數(shù)組的一般說明形式如下:
type-specifier var_name [size];
在C語言中,數(shù)組必須顯示地說明,以便編譯程序?yàn)樗鼈兎峙鋬?nèi)存空間。在上式中,類型說明符指明數(shù)組的類型,也就是數(shù)組中每一個(gè)元素個(gè)數(shù),一維數(shù)組的總字節(jié)數(shù)可按下式計(jì)算:
sizeof( 類型) *數(shù)組長度= 總字節(jié)數(shù)
[例5-1] 將數(shù)字0到9裝入一個(gè)整型數(shù)組。
main( )
{
int x[10]; /* 定義包含1 0個(gè)整型數(shù)的數(shù)組,引用為x [ 0 ] ,x [ 1 ] . . . x [ 9 ] * /
int t ;
for (t=0; t<10;++t) x[t]=t;
}
C語言并不檢驗(yàn)數(shù)組邊界,因此,數(shù)組的兩端都有可能越界而使其它變量的數(shù)組甚至程序代碼被破壞。在需要的時(shí)候,數(shù)組的邊界檢驗(yàn)便是程序員的職責(zé)。例如,當(dāng)使用gets( )接收字符輸入時(shí),必須確認(rèn)字符數(shù)組的長度足以存放最長的字符串。
一維數(shù)組在本質(zhì)上是由同類數(shù)據(jù)構(gòu)成的表,例如,對(duì)下列數(shù)組a :
char a[7]
圖5 - 1說明了數(shù)組a在內(nèi)存中的情形,假定起始地址為1000。
5.1.1 向函數(shù)傳遞一維數(shù)組
將一維數(shù)組傳遞給函數(shù)時(shí),把數(shù)組名作為參數(shù)直接調(diào)用函數(shù)即可,無需任何下標(biāo)。這樣,數(shù)組的第一個(gè)元素的地址將傳遞給該函數(shù)。C語言并不是將整個(gè)數(shù)組作為實(shí)參來傳遞,而是用指針來代替它。例如,下面的程序?qū)?shù)組i的第一個(gè)元素的地址傳遞給函數(shù)func1( )。
main( )
{
int i[10];
func1(i); /*函數(shù)調(diào)用,實(shí)參是數(shù)組名* /
. . .
}
函數(shù)若要接收一維數(shù)組的傳遞,則可以用下面的二種方法之一來說明形式參數(shù); 1) 有界數(shù)組;2) 無界數(shù)組。例如,函數(shù)func1 ( )要接收數(shù)組i可如下說明:
func1(str)
char str[10]; /* 有界數(shù)組,數(shù)組的下標(biāo)只能小于或等于傳遞數(shù)組的大小。* /
{
.
. .
}
也可說明為:
func1(str)
char str[ ]; / * 無界數(shù)組* /
{
.
. .
}
這二種說明方法的效果是等價(jià)的,它們都通知編譯程序建立一個(gè)字符指針。第一種說明使用的是標(biāo)準(zhǔn)的數(shù)組說明;后一種說明使用了改進(jìn)型的數(shù)組說明,它只是說明函數(shù)將要接收一個(gè)具有一定長度的整型數(shù)組。細(xì)想就會(huì)發(fā)現(xiàn),就函數(shù)而言,數(shù)組究竟有多長并無關(guān)緊要,因?yàn)镃語言并不進(jìn)行數(shù)組的邊界檢驗(yàn)。事實(shí)上,就編譯程序而言,下面的說明也是可行的。
func1 (str);
int str[32];
{
. . .
}
因?yàn)榫幾g程序只是產(chǎn)生代碼使函數(shù)func1( )接收一個(gè)指針,并非真正產(chǎn)生一個(gè)包含3 2個(gè)元素的數(shù)組。
5.1 一維數(shù)組
一維數(shù)組的一般說明形式如下:
type-specifier var_name [size];
在C語言中,數(shù)組必須顯示地說明,以便編譯程序?yàn)樗鼈兎峙鋬?nèi)存空間。在上式中,類型說明符指明數(shù)組的類型,也就是數(shù)組中每一個(gè)元素個(gè)數(shù),一維數(shù)組的總字節(jié)數(shù)可按下式計(jì)算:
sizeof( 類型) *數(shù)組長度= 總字節(jié)數(shù)
[例5-1] 將數(shù)字0到9裝入一個(gè)整型數(shù)組。
main( )
{
int x[10]; /* 定義包含1 0個(gè)整型數(shù)的數(shù)組,引用為x [ 0 ] ,x [ 1 ] . . . x [ 9 ] * /
int t ;
for (t=0; t<10;++t) x[t]=t;
}
C語言并不檢驗(yàn)數(shù)組邊界,因此,數(shù)組的兩端都有可能越界而使其它變量的數(shù)組甚至程序代碼被破壞。在需要的時(shí)候,數(shù)組的邊界檢驗(yàn)便是程序員的職責(zé)。例如,當(dāng)使用gets( )接收字符輸入時(shí),必須確認(rèn)字符數(shù)組的長度足以存放最長的字符串。
一維數(shù)組在本質(zhì)上是由同類數(shù)據(jù)構(gòu)成的表,例如,對(duì)下列數(shù)組a :
char a[7]
圖5 - 1說明了數(shù)組a在內(nèi)存中的情形,假定起始地址為1000。
5.1.1 向函數(shù)傳遞一維數(shù)組
將一維數(shù)組傳遞給函數(shù)時(shí),把數(shù)組名作為參數(shù)直接調(diào)用函數(shù)即可,無需任何下標(biāo)。這樣,數(shù)組的第一個(gè)元素的地址將傳遞給該函數(shù)。C語言并不是將整個(gè)數(shù)組作為實(shí)參來傳遞,而是用指針來代替它。例如,下面的程序?qū)?shù)組i的第一個(gè)元素的地址傳遞給函數(shù)func1( )。
main( )
{
int i[10];
func1(i); /*函數(shù)調(diào)用,實(shí)參是數(shù)組名* /
. . .
}
函數(shù)若要接收一維數(shù)組的傳遞,則可以用下面的二種方法之一來說明形式參數(shù); 1) 有界數(shù)組;2) 無界數(shù)組。例如,函數(shù)func1 ( )要接收數(shù)組i可如下說明:
func1(str)
char str[10]; /* 有界數(shù)組,數(shù)組的下標(biāo)只能小于或等于傳遞數(shù)組的大小。* /
{
.
. .
}
也可說明為:
func1(str)
char str[ ]; / * 無界數(shù)組* /
{
.
. .
}
這二種說明方法的效果是等價(jià)的,它們都通知編譯程序建立一個(gè)字符指針。第一種說明使用的是標(biāo)準(zhǔn)的數(shù)組說明;后一種說明使用了改進(jìn)型的數(shù)組說明,它只是說明函數(shù)將要接收一個(gè)具有一定長度的整型數(shù)組。細(xì)想就會(huì)發(fā)現(xiàn),就函數(shù)而言,數(shù)組究竟有多長并無關(guān)緊要,因?yàn)镃語言并不進(jìn)行數(shù)組的邊界檢驗(yàn)。事實(shí)上,就編譯程序而言,下面的說明也是可行的。
func1 (str);
int str[32];
{
. . .
}
因?yàn)榫幾g程序只是產(chǎn)生代碼使函數(shù)func1( )接收一個(gè)指針,并非真正產(chǎn)生一個(gè)包含3 2個(gè)元素的數(shù)組。