C语言详解 - 数组
1. 使用數組的好處
?要計算某班的平均分數,假設該班只有10個學生。利用前面所學知識,可以有如下兩種方法:
方法一:利用一個變量存儲分數
#include?<stdio.h>int?main(void)
{
????int?score?=?0;??//存儲分數的變量
????int?count?=?10;?//學生人數
????long?sum?=?0L;??//總分數
????float?average?=?0.0f;?//平均分
????for(int?i=0;?i<count;?i++)
????{
????????printf("Enter?score:?");
????????scanf("%d",?&score);?//從鍵盤讀入一個分數
????????sum?+=?score;?//將讀入的分數加到總分數里面
????}
????average?=?(float)sum/count;?//計算平均分
????printf("\nLast?score?is:?%d",?score);
????printf("\nAverage?of?the?10?scores?entered?is:?%f\n",?average);?//輸出平均分
????return?0;
}
?
點評:該方法只保留了最后一個學生的分數,其他學生的分數全部丟失了。因此,如果我們想在此程序的基礎上繼續求最高分和最低分是行不通的。
下面采用第二種方法。聲明10個變量來保存10個學生的分數。
方法二:利用多個變量存儲分數
#include?<stdio.h>int?main(void)
{
????//定義10個變量分別存儲10個學生的分數
????int?score0?=?0,?score1?=?0,?score2?=?0,?score3?=?0,?score4?=?0;
????int?score5?=?0,?score6?=?0,?score7?=?0,?score8?=?0,?score9?=?0;
????long?sum?=?0L;????????//總分數
????float?average?=?0.0f;?//平均分
????printf("Enter?the?10?scores:");
????scanf("%d%d%d%d%d%d%d%d%d%d",?
????????&score0,?&score1,?&score2,?&score3,?&score4,
????????&score5,?&score6,?&score7,?&score8,?&score9);?//輸入各個學生的分數
????sum?=?score0?+?score1?+?score2?+?score3?+?score4?+?
??????????score5?+?score6?+?score7?+?score8?+?score9;?//計算總分
????average?=?(float)sum/10.0f;?//計算平均分
????printf("\nAverage?of?the?10?scores?entered?is:?%f\n",?average);?//輸出平均分
????return?0;
}
?
點評:該方法克服了方法1中的缺點。但如果班里有50、100或1000個學生,該方法就不切實際了,而應該使用數組。
?
2. 什么是數組
方法2中,聲明了10個不同的變量來存放10個分數。共同點是它們都為整型變量。為了解決方法2存在這樣的話,我們可以用數組對這10個變量進行統一聲明:
int?score[10];以上語句聲明了一個數組,數組的名稱為score,它包含10個元素,每個元素的類型為整型。
數組是一組數目固定、類型相同的元素組成的集合。其中,數目固定指的是元素的個數在程序運行的時候不能更改,類型相同指所有的元素具有相同的數據類型。如:全部為int, long, float, char或其它類型。
怎樣訪問數組里面的元素呢?我們采用數組名和元素在這個數組中的位置來訪問。需要注意的是位置總是從0開始,也稱為下標或索引。因此數組中的10個元素分別為:
score[0], score[1], score[2], score[3], score[4], score[5], score[6], score[7], score[8], score[9]
其中,score[0]為數組的第一個元素,score[9]為數組的第十個元素,也即最后一個元素。如果i=2, 那么score[i]與score[2]等價,表示數組的第三個元素。
利用數組計算平均分的程序為:
方法三:利用數組存儲分數
#include?<stdio.h>int?main(void)
{
????int?score[10];??//存儲10個整型值的數組
????int?count?=?10;?//學生人數
????long?sum?=?0L;??//總分數
????float?average?=?0.0f;?//平均分
????printf("Enter?the?10?scores:?\n");
????for(int?i=0;?i<count;?i++)
????{
????????scanf("%d",?&score[i]);?//從鍵盤讀入一個分數
????????? sum?+=?score[i];?//將讀入的分數加到總分數里面
????}
????average?=?(float)sum/count;?//計算平均分
????
????printf("The?10?scores?are:?");
????for(i=0;?i<count;?i++)
????????printf("%d?",?score[i]);?//輸出各個分數
????printf("\nAverage?of?the?10?scores?entered?is:?%f\n",?average);?//輸出平均分
????return?0;
}
?
當編譯器對以上代碼進行編譯時,假設計算機指定數組score中的元素從地址為1000的地方開始存放。那么,存放一個元素,計算機需要給該數組多少空間呢?
由于每個元素的數據類型為int,而一般來說,int占用4個字節,所以計算機需要為每一個元素分配4個字節的存儲空間。如下圖所示:元素score[0]占用了編號為1000, 1001, 1002, 1003共4個字節的內存空間。score[1]占用1004 - 1007號內存空間。其余元素依此類推。
當聲明數組?int score[10]; 時,計算機就為數組預留10×4=40字節的存儲空間,正式的說法是分配40字節的存儲空間,此時空間里面沒有存放東西。對于數組中的各元素,它們的存儲空間是連續的,沒有間斷。因此,如果知道了某個元素的存放地址,就能準確獲取其它元素的存放地址。
下圖是對數組聲明的一些解說:
獲取元素的地址類似于普通變量,它們的對比如下:
#include?<stdio.h>int?main(void)
{
????int?x,?y,?z;
????int?score[3];?
????scanf("%d?%d?%d",?&x,?&y,?&z);?//輸入三個值分別存入變量x,?y和z中
????scanf("%d?%d?%d",?&score[0],?&score[1],?&score[2]);?//輸入三個值分別存入數組的第1,2,3個元素中
????printf("%d?%d?%d?\n",?x,?y,?z);?//輸出變量的值
????printf("%p?%p?%p?\n",?&x,?&y,?&z);?//輸出變量的地址
????printf("%d?%d?%d?\n",?score[0],?score[1],?score[2]);?//輸出數組中元素的值
????printf("%p?%p?%p?\n",?&score[0],?&score[1],?&score[2]);?//輸出數組中各元素的地址
????return?0;
}
?
3.?二維、三維數組以及數組元素在內存中的存儲方式
以下是一些一維數組的聲明:
int??????? score[10];char??????letter[26];
float????? percentage[20];
double???diameter[15];
?
二維數組和三維數組的聲明方式如下:
/*?二維數組的聲明?*/int???????? position[10][10];
int???????? wheretog[10][10];
float????? coordina[52][15];
double?? floor_go[60][20];
/*?三維數組的聲明?*/
int??????? position[10][20][30];
char???? position[10][20][30];
double?? situaion[10][20][30];
?
我們已經知道一維數組元素在內存中的存放方式,二維,三維在內存中是如何存放的呢?
假設聲明如下的二維數組和三維數組:
int???? coo[2][3];char???pos[2][3][4];
?
分析:
當聲明二維數組coo時,計算機分配了2×3=6個int大小的內存空間,當聲明三維數組pos時,計算機分配了2×3×4=24個char大小的內存空間。以下為數組的內存分配示意圖:
?
4.?一維、二維、三維數組的初始化
4.1 已知數組維數的初始化
(1)元素個數與初始值個數恰好相等的情況
例1:
int?axis[2]?=?{?1,?2?};int?plane[2][3]?=?{?{?1,?2,?3?},?{?4,?5,?6?}?};
int?cubic[2][3][4]?=?{?
????{
????????{?1,??2,??3,??4?},
????????{?5,??6,??7,??8?},
????????{?9,?10,?11,?12?}?
????},
????{
????????{?13,?14,?15,?16?},
????????{?17,?18,?19,?20?},
????????{?21,?22,?23,?24?}
????}
};
?
例2:
int?axis[2]?=?{?1,?2?};int?plane[2][3]?=?{?1,?2,?3,?4,?5,?6?};
int?cubic[2][3][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??
???????????????????????9,?10,?11,?12,?13,?14,?15,?16,?
??????????????????????17,?18,?19,?20,?21,?22,?23,?24?};
?
(2)元素個數與初始值個數不相等的情況
例1:
/*?數組的其余位置自動設為零?*/bool?axis[4]?=?{?true,?false,?1?};
char?plane[2][3]?=?{?'0',?'1',?'2',??3,??4?};
int??cubic[2][3][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12,?13?};
?
調試查看數組在內存中的內容如下(紅色的代表數組獲得的指定初值,紫色的為系統自動賦的初值):
Name????????Value
+?&axis???? 0x0012ff4c?? ""
+?&plane?? 0x0012ff44?? "012"
+?&cubic?? 0x0012fee4?? ""
0012FEDA? CC CC CC CC CC CC CC CC CC CC 01? 燙燙燙燙燙.
0012FEE5? 00 00 00 02 00 00 00 03 00 00 00? ...........
0012FEF0? 04 00 00 00 05 00 00 00 06 00 00? ...........
0012FEFB? 00 07 00 00 00 08 00 00 00 09 00? .........?.
0012FF06? 00 00 0A 00 00 00 0B 00 00 00 0C? ...........
0012FF11? 00 00 00 0D 00 00 00 00 00 00 00? ...........
0012FF1C? 00 00 00 00 00 00 00 00 00 00 00? ...........
0012FF27? 00 00 00 00 00 00 00 00 00 00 00? ...........
0012FF32? 00 00 00 00 00 00 00 00 00 00 00? ...........
0012FF3D? 00 00 00 00 00 00 00 30 31 32 03? .......012.
0012FF48? 04 00 CC CC 01 00 01 00 00 00 00? ..燙.......
?
4.2 未知數組維數的初始化
根據數組元素在內存中的分配規則可知,數組的某個維的大小可以省略,且這個維只能是數組最左邊的一個維,數組在聲明的同時還必須初始化。見下例:
//正確的維大小缺省bool?condition[?]?=?{?true,?false,?1?};?//相當于condition[3]
char?plane_a[?][3]?=?{?'0',?'1'?};?//相當于plane_a[1][3],數組第一個元素為字符'0',其它為0
char?plane_b[?][3]?=?{?'0',?'1',?'2',?'3'?};?//相當于plane_b[2][3]
int?? cubic_a[?][3][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};?//相當于cubic_a[1][3][4]
int?? cubic_b[?][3][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12,?13?};?//相當于cubic_b[2][3][4]
//錯誤的維大小缺省
//char?plane_a[?][?]?=?{?1,?2,?3?};
//char?plane_a[1][?]?=?{?1,?2,?3?};
//int??cubic_a[?][?][?]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
//int??cubic_a[?][?][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
//int??cubic_a[?][3][?]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
//int??cubic_a[2][3][?]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
//int??cubic_a[2][?][?]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
//int??cubic_a[2][?][4]?=?{?1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11,?12?};
?
總結
以上是生活随笔為你收集整理的C语言详解 - 数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCNA11
- 下一篇: 过滤“清扬男士”Flash广告