陣列?啥?是列陣吧?要打仗嗎? 喔,不不不,是陣列無誤。這是英文 Array 翻譯而來的結果。不過,說真的,光聽陣列這兩個字其實頗抽象的,因為從字面上很難去了解它到底是什麼樣的東西。 也許我們可以拿戰爭中常用的陣形來作比喻。
上面這個畫面,是許多古典戰爭片中常看到的畫面,也就是所謂的隊形或者是陣行。
上圖的紅線,是這些軍人所排成的一排直線,如果我們不計算每條紅線上的軍人人數,然後將這些紅線化為程式語言的話就會長得像這樣子:
1 2 3 |
int[] army = new int[5]; // 5排軍人(Java) int army[5]; // 5排軍人(C/C++) |
以上這兩種語言的程式碼都是在做同樣的一件事情,那就是向電腦記憶體說:「我要一個能放5個東西的地方。」
「咦?不是5排軍人嗎?」我猜你會想這樣問,不過這是我們對這行程式碼所給的定義啊!但是在電腦的認知裡,這兩種程式碼都是在跟電腦要求一個能存放數值的空間,而這空間通常都是記憶體空間。
有點模糊嗎?
其實陣列,說簡單一點就是一排很多空格的櫃子,每一格都有編號,編號從0到你所設定的格數(長度)為止。以剛剛那個程式碼來講,他第一排軍人的編號是0而不是1,第二排的編號則是1..以此類推。
假設我今天想要給第一排的軍人一些任務,那麼我的程式碼就要這樣下:
1 2 |
army[0]; // 第一排(C,Java共通) |
但實際上這樣用是沒任何意義的,總不能我叫他們出來卻又不給任何指令或任務吧?因此,我想指派第100號任務給他們去做,那麼我的程式碼就會是這樣:
1 2 |
army[0]=100; // 第一排去做100號任務 |
然後這排軍人就會去做那個第100號任務…但實際上電腦的解讀卻不是這樣的。 電腦對上面這個程式碼所做的事情是在記憶體裡的對應位置放入100這個整數數值,但我們在撰寫與設計程式的時候其實可以不用執意在那些既有的定義上,放輕鬆,把自己的想法化成程式碼比固守定義來的輕鬆許多。
不過,將自己的想法化成程式碼還是要對這些程式碼多了解一些。
先前提過,陣列如同一排很多空格的櫃子,每一格都有編號,每一格都有屬於自己在記憶體房間的位置。
從上圖這樣看,我知道還有些難理解,那搭配一下下面這個範例自己理解一下看看如何?
1 2 3 |
char array[4]; //宣告字元陣列(C/C++) char[] array = new char[4]; //宣告字元陣列(Java) |
上面的程式碼代表我向電腦記憶體要求一個名字為array的櫃子準備讓我放東西進去,這時櫃子裡面是空的。接下來我要分別在0~3號的格子裡面放入A、B、C、D這幾個資料,那我的程式碼就得這樣下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 逐一放資料到格子裡 array[0] = 'A'; array[1] = 'B'; array[2] = 'C'; array[3] = 'D'; // 一次輸入(C/C++) // 這個用法需要一次設定到位 char[4] array = {'A', 'B', 'C', 'D'}; // 一次輸入(java) char[] array = {'A', 'B', 'C', 'D'}; |
化成圖片解釋的話就會長得像這樣
「那麼如果要把裡面的東西拿出來呢?」
1 2 3 4 |
printf("%s",array[0]); // 拿出array櫃子第0格的東西並顯示(C/C++) System.out.println(array[0]); // 拿出array櫃子第0格的東西,並顯示(Java) |
「你講的那些都要一個一個打,如果我有二、三十個那我不就打到死…」
別慌,從上面的許多內容我們知道陣列是利用編號來取得資料,所以我們可以應用之前所講的for迴圈以及變數互相配合來達到一次列出的目的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// C/C++ // 取得陣列長度 int arrayLength = sizeof(array) / sizeof(array[0]); // n代表格子編號 int n; for(an=0;n<arrayLength;n++) { printf("%s",array[n]); } // Java // n代表格子編號 int n; for(n=0;n<array.length;n++){ // array.length System.out.println(array[n]); // 是JAVA取得長度的語法 } |
上面所講的這些都是一維陣列,什麼是一維陣列呢? 一維陣列就是只有單純一個櫃子與好多個你設定的空格所組合起來的,圖像上來看就是一個平面。
陣列不只這一種,他還有二維、三圍維…N維陣列,一切看你當初怎麼跟電腦記憶體說的。
1 2 3 4 5 6 |
int iarr[5][6]; // 二維陣列宣告(C/C++) int iarr3[3][4][4]; // 三維陣列宣告</pre> int[][] iarr = new iarr[5][6]; // 二維陣列宣告(Java) int[][][] iarr3 = new iarr3[3][4][5]; // 三維陣列宣告 |
至於這種多維陣列的使用,其實也大同小異不會差太多,需要注意的是,你頭腦對這些陣列清不清楚。 多維陣列說穿了只不過是櫃子的格子裡面還有櫃子這樣而已…怎好像繞口令? 以iarr這個櫃子來說好了,它就是一個擁有五層且每一層有6個格子的大櫃子。
而iarr3則是有三層,但每一層裡面還有四層,且這四層的每一層則有5個小格子的櫃子。圖我就不畫了…
「這種你說的多維陣列要怎麼用啊?」
你的意思是怎麼放東西進去跟怎麼拿出來對吧? 這時候就需要用到巢狀迴圈了,巢狀迴圈就是迴圈裡面還有迴圈的意思,你可以參考
這篇文章。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * Java * 將數值放入多維陣列中 * 以下可以對照上圖,方便理解。 **/ int[5][6] iarr = {{4,11,12,13,14,15}, {3,11,12,13,14,15}, {2,11,12,13,14,15}, {1,11,12,13,14,15}, {0,11,12,13,14,15}}; /** * 巢狀迴圈取出櫃子裡的東西 * i 為櫃子編號, j 為格子編號 **/ int i,j; for(i=0;i<iarr.length;i++){ for(j=0;j<iarr[i].length;j++){ System.out.print(iarr[i][j] + " "); // 顯示 i 層第 j 個格子東西 } System.out.println(); // 每顯示完一層就斷行 } // 個別取出 System.out.println(iarr[0][1]); |
喔!對了,陣列的東西不只是顯示而已,他的內容是可以放進別的變數裡面的。
1 2 |
int x = iarr[1][3]; |
陣列其實還有其他的觀念,這我們待下回再繼續,今天就先到這裡了,不過我想要出個小題目給大家玩玩。
請將這段話化為程式語言: 有一個三層的書架,每一層又分為上下兩層,這兩層分別可以容納5本10公分厚的小說。
Have fun! 希望這些能幫助到你。