作者LoganChien (簡子翔)
看板b97902HW
標題[計程] 陣列簡介
時間Wed Oct 1 18:08:08 2008
前言
為什麼要打這一篇呢?因為我做
單班計程 HW 1-2 的時候想不出
不用陣列的方法,又聽說還沒有講過陣列,所以稍微講解一下陣列
要怎麼用。
陣列簡介
我們可以先把陣列想像成表格的儲存格,每一個儲存格可以存一個
數值/元素。拿 int 為例子,
int array[5];
就是宣告一個有五個儲存格的表格,每一個儲存格可以存放一個
int。
而每一個儲存格都有一個索引,從前面開始,依序為 0, 1, 2, 3,
4。如果我要存取第一個儲存格,我就必需要用
array[0]
我們來看下面的表格:
array =
0 1 2 3 4 <= 這就是索引
┌───┬───┬───┬───┬───┐
│7689 │2348 │8608 │90 │1 │<= 這是儲存格(元素)
└───┴───┴───┴───┴───┘
如果我 printf("%d", array[0]) 會印出 7689,如果我要印其他的
值,則用法如下:
printf("%d", array[1]); // 2348
printf("%d", array[2]); // 8608
其餘請自行類推。
陣列宣告
陣列的宣告,原則上是
元素型別 陣列名稱 [ 陣列大小 ] ;
*
元素型別 可以是 char, short, int, long, float, double,
long double 族繁不及備載。
*
陣列名稱 必需是
合法的 C 語言變數名稱。
也就是滿足以下的正
規表達示。/[A-Za-z_]+[A-Za-z0-9_]*/
*
陣列大小 是你想要的大小,也就是有多小儲存格。
注意:最大的
索引會比這一個值少 1。
例如:
int a[10];
float b[2];
char c[1234];
還有一些陣列宣告的變化型。我們可以在宣告陣列的時候,同時加上
初始值,方法如下:
元素型別 陣列名稱 [ 陣列大小 ] = { 元素0, 元素1, .... };
例如:
int array[5] = {1, 2, 4, 8, 16};
會讓我們有:
array =
0 1 2 3 4 <= 這就是索引
┌───┬───┬───┬───┬───┐
│1 │2 │4 │8 │16 │<= 這是儲存格(元素)
└───┴───┴───┴───┴───┘
如果你有加上初始值,最左邊的維度可以省略(編譯器會幫我們算出
來),如下:
int array[] = {1, 2, 4, 8, 16, 32};
等價
int array[6] = {1, 2, 4, 8, 16, 32};
陣列元素的存取
如果要存取單一個元素,你可以用下標運算子(subscript),也就是在
陣列名字之後加上 [],例如:
int array[5] = {1, 2, 4, 8, 16};
array[0] == 1
array[1] == 2
array[2] == 4
array[3] == 8
array[4] == 16
如果要印出來,可以配合 for 來使用。
for (i = 0; i < 5; ++i) {
printf("%d\n", array[i]);
}
如果要當成輸入,也是一樣,
for (i = 0; i < 5; ++i) {
scanf("%d", &(array[i]));
}
如果我們要改其中的一個值,就像用一般的變數一樣。例如
array[3] = 12345;
而如果要 複製 一個陣列,我們必需一個元素一個元素去改,
如下,不可以直接指派:
int array2[5];
int i;
for (i = 0; i < 5; ++i) {
array2[i] = array[i];
}
陣列的常見錯誤
<錯> 陣列指派(Assign)
int array[5] = {1, 2, 4, 8, 16};
int array2[5] = array; /* 錯!錯!錯!錯!錯!沒有這種寫法 */
這一個當然也錯:
int array[5] = {1, 2, 4, 8, 16};
int array2[5];
array2 = array;
<錯> 溢位(通常可以正常編譯,不過會「本程式即將要關閉」或 RE)
int array[5] = {1, 2, 4, 8, 16};
int i;
for (i = 1; i <= 5; ++i) {
printf("%d\n", array[i]);
}
<錯> 動態的陣列大小
int size;
scanf("%d", &size);
int array[size];
......
結語
這一次陣列暫時介紹到這裡,有機會再向大家介紹其他陣列還有
指標的用法。如果這一篇文有錯,還請大家指教。
還有,我想問:鋼彈在哪裡?這不是鋼彈,這不是鋼彈...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.241.166
※ 編輯: LoganChien 來自: 140.112.241.166 (10/01 18:38)
1F:推 hrs113355:大大風範>///< 10/01 18:40
2F:推 iForests:好文推,沒有陣列應該解不了第二題 10/01 20:34
3F:推 enhuang:收精華了啦 10/01 21:37
4F:推 jimmyken793:別急 鋼彈蛋蛋快要開撥了 10/01 21:42
5F:推 ming1053:C好像不能compile用變數當大小宣告的array ... 10/01 22:34
※ 編輯: LoganChien 來自: 140.112.241.166 (10/01 22:39)
6F:→ LoganChien:我把它改得明顯一點了。 10/01 22:40
7F:→ martinku:可是我編譯沒問題ㄟXD~到底是怎麼回事..... 10/01 23:25
8F:→ LoganChien:1. 有可能是 編譯器 的 bonus, 它會處理 10/01 23:29
9F:→ LoganChien:2. 可能編譯器隨便代入一個數字 10/01 23:29
10F:推 ming1053:Dev-C++會用g++來compile吧 gcc就不會過了... 10/01 23:29
11F:→ ming1053:因為那在C++裡面是可以的 10/01 23:30
12F:→ LoganChien:至於是哪一種,我們需要強者來反組譯! 10/01 23:30
13F:推 jimmyken793:Dev C++是看副檔名的 你副檔名要存成 .c才會用gcc 10/01 23:34
14F:→ martinku:我是這樣寫然後上傳批改娘過了XD 10/01 23:40
15F:→ LoganChien:gcc 也會過,而且我高度懷疑是 gcc 的 extension。 10/01 23:41
16F:推 pangfeng:好文. 10/01 23:42
18F:→ LoganChien:不過我個人不鼓勵使用這一種寫法,除非你的環境永遠是 10/01 23:49
19F:→ LoganChien:GCC or Standard C99 10/01 23:49
20F:→ ming1053:可以補一下歸零的方法 10/01 23:53
21F:→ martinku:批改娘能過還奇妙的 10/02 00:04
22F:→ LoganChien:To Ming1053, 我寫到下一集好了,字串、多維陣列、秘密 10/02 00:07
23F:→ LoganChien:To Martinku, 批改娘我猜是 GCC,而且也可以用 C99。 10/02 00:08
24F:推 ckclark:/usr/bin/gcc-3.4 -c -std=c99 -Wall -fno-builtin -O1 10/02 00:09
25F:推 hrs113355:歸零用memset... 10/02 00:15
26F:推 ming1053:樓上好用的奧步XD 10/02 00:43
27F:推 hrs113355:快又有效XD 10/02 00:49
28F:推 anfranion:memset()用來歸零可以 其他的就不一定了XD 10/02 00:51
29F:推 ckclark:還可以歸-1 XD 10/02 00:54
30F:推 sa072686:還可以設不小的數(歸infinity?XD) 10/02 01:08
31F:推 hrs113355:還可以歸心似箭 10/02 01:08
32F:推 averangeall:還可以歸苓膏 10/02 01:11
33F:→ LoganChien:我想出 HW 1-2 不用陣列的方法了,現在才想出來,OTZ。 10/03 00:46
34F:推 Poplarysl:我寫出來了XD 一千多行囧RZ 10/03 17:31
35F:→ Poplarysl:助教說他寫大概一百多行吧~ 10/03 17:32
36F:→ Poplarysl:是頂多啦 實際怎樣就不知道了!! 10/03 17:32
37F:→ LoganChien:剛才我試了一下我的想法,沒有問題,49 行。 10/03 23:29
38F:→ LoganChien:提示:小於等於 5 的非負有理數是 6 個。另外,會用到 10/03 23:30
39F:→ LoganChien:for, switch, if 10/03 23:31