c語言 多元數組
c語言 多元數組
一、高維數組
有時,數組的維數并不止一維,例如一個記錄消費中心在第一季度裡各個月的收入資料就可以用二維數組來表示。定義二維數組的方法是在一維數組定義的後面再加上一個用方括号括起來的維數說明。例如:
float array[3][8];
實際上,這個數組可以看成3個連續的一維數組,每個一維數組具有8個元素。該數組在記憶體中的存儲格式為最左邊的維數相同的元素連續存儲,也即按行存儲的。首先存儲第一行8個元素,其次是第二行,最後是第三行。
main()
{
int array[3][3]={1,2,3,4,5,6,7,8,9};
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++) printf(%3d);
printf(\n);
}
}
它的輸出結果為:
1 2 3
4 5 6
7 8 9
可以看出,二維數組元素是按行存儲的。
我們也可以對數組進行指派,而不是初始化。
main()
{
int array[3][3];
int i,j;
for(j=0;j<3;j++)
for(i=0;i<3;i++) scanf(%d,&array[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++) printf(%3d);
printf(\n);
}
}
當輸入1 2 3 4 5 6 7 8 9
輸出為:
1 4 7
2 5 8
3 6 9
數組可以是二維、三維甚至是更高維數的,雖然C語言對維數的處理沒有上限,但是處理高維數組是很頭疼的事。一般盡量避免處理四維和四維以上的數組。下面看一個三維數組的例子:
main()
{
int array[2][3][4];
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<4;k++) array[i][j][k]=i*12+j*4+k;
}
這個三維數組可以看成2個二維數組,每個二維數組又可以看成3個一維數組。可以在頭腦裡想象成兩個平行平面,每個平面内有3*4個點。是以共有24個元素。
二、字元串數組
上面講的都是存放數值的,有一類數組,用來處理字元串的,我們叫字元串數組。其實字元串數組也是二維數組,隻是它的特殊性,才單獨拿出來說的。
main()
{
char s[10][10];
int i;
for(i=0;i<10;i++) scanf(%s,s[i]);
}
先看它的輸入特性,前面在說輸入語句的時候說過,遇到字元串輸入,可以不加'&',現在隻要記住這個特性就可以,以後說指針的時候再講為什麼。但是這兒為什麼用s[i],可能很多人不太明白。我們定義的是二維數組,而輸入的時候,卻使用一維數組的形式。這是因為字元串在記憶體裡位址可以用它的名字表示,就好象這種形式:
main()
{
char s[10];
scanf(%s,s);
}
定義的是一維數組,輸入語句用變量形式表示一樣。通過前面的'%s'形式可以看出,s[i]是一個數組,是以s就是二維數組了。
這裡要注意一點,scanf()函數在輸入字元串時候不能支援空格,看下面的例子:
main()
{
char s[3][10];
int i;
for(i=0;i<10;i++)
scanf(%s,s[i]);
for(i=0;i<3;i++)
printf(%s\n,s[i]);
}
我們輸入:1111
2222 3333
4444
我們是想把1111指派給s[0],2222 3333指派給s[1],4444指派給s[2]。可實際上編譯器是這樣做的,把1111指派給s[0],把2222指派給[1],把3333指派給s[2]。
實際輸出:1111
2222
3333
在輸入字元串的時候,如果使用scanf(),就把空格當作下一個輸入了。那麼我們怎麼解決這個問題呢?畢竟很多情況下,一行字元串肯定有空格出現的。我們使用新的函數gets()。這個函數是專門接受字元串輸入的,它跳過了空格的影響。把上面的輸入語言修改為gets(s[i])即可。
我們定義了char s[3][10],超過10個字元肯定不行,如果少于10個字元,電腦怎麼處理呢?電腦是在每個字元串的後面自動補上'\0',作為字元串的結束标志。
我們經常在填寫一些可選擇的内容時經常發現,待選的字元串都是按字母排列好的,我們怎麼用C語言實作這個功能?在C語言裡,字元串的排序是按照字元的ASCII碼來的,如果第一個字元一樣,則比較第二個,依次類推。
main()
{
char s1[6]=addfgh,s2[5]=asdlg;
int i;
for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
{
if(s1[i] {
printf