第二十二章 神奇的口袋(下)
而且C語言為我們提供了兩種向口數(shù)組面放數(shù)據(jù)的方式,第一種是一次性放進去:
int arr[10]={0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9};
這樣數(shù)組會根據(jù)右邊大括號中的順序按0到9對這10個數(shù)據(jù)進行編號,也就是說arr[0]等于0,arr[1]等于1,以此類推,arr[9]等于9。
使用這種方法甚至不用告訴計算機有多少個元素,它會根據(jù)大括號里面的內容去推斷,所以說用下面這種寫法也是可以的。」
int arr[]={0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9};
「這么看來,計算機也并不是完全是個智障嘛,還有一點推斷能力。那另外一種放東西的方式是怎樣的呢?」
我打趣道。
「哈哈,另外一種,就是一個一個的往里面放咯。就像這種:
int arr[10];
arr[0]= 0;
arr[1]= 1;
……
arr[9]= 9;
不過有一點要注意,如果要一次性把數(shù)據(jù)放進數(shù)組這個袋子里只有一次機會,就是在聲明完成之前,像下面這種方式就是錯誤的,:
int arr[10];
arr ={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
在執(zhí)行int arr[10];的時候,數(shù)組的聲明就已經完成了?!?p> 「好嘛,曉得了。」
我點了點頭。
「那對于如何得到一個口袋這塊有什么問題么?」
「嗯~,這個倒是沒有什么?!?p> 我搖了搖頭,然后接著說道:「我在想,如果把剛剛你說的那個地圖數(shù)據(jù)用一個數(shù)組把它裝起來倒是沒有問題,不過好像要得到行號和列號就有些困難了?!?p> 我蹙眉苦思道。
「我們依然用剛剛那個地圖數(shù)據(jù)來說明:
編號_行號_列號 0 1 2 3 4 5 6 7
00____0_______0 0 3 3 3 0 0 0
08____1_______0 0 3 4 3 0 0 0
16____2_______0 0 3 0 3 3 3 3
24____3_______3 3 3 2 0 2 4 3
32____4_______3 4 0 2 1 3 3 3
40____5_______3 3 3 3 2 3 0 0
48____6_______0 0 0 3 4 3 0 0
56____7_______0 0 0 3 3 0 0 0
在左邊我標出了每一行第一個元素在數(shù)組中的編號以及行號,在上方我標出了列號,你能夠看出行號和列號與數(shù)組編號的關系嗎?」
「行號等于每一行第一個元素的數(shù)組標號除以8!列號等于數(shù)組編號減去每一行第一個元素的數(shù)組編號!」
我驚奇地叫到,仿佛發(fā)現(xiàn)了新大陸。
「雖然不是完全正確,但是已經接近真實答案了!再觀察一下呢!說不定就發(fā)現(xiàn)規(guī)律了哦。」
老爹笑了笑。
「嗯……」
我咬著左手拇指指甲,睜大眼睛盯著著屏幕上老爹打出來的這些數(shù)字,想從其中找出點什么規(guī)律來。
在這個過程中,老爹一直沒有打擾我。不過我始終不得要領,直到把指甲咬碎了一塊也沒有從中看出什么規(guī)律來。
「老爹,我沒有看出其他規(guī)律了……」
我眼巴巴地望向了老爹,只能向他求助了。
「其實你剛剛已經說得很相近了,就差那么一點點。不過沒關系了,畢竟以前你沒有接觸過這方面的,能夠一下子就找到先前的規(guī)律已經很不錯了。
其實元素在數(shù)組中的編號=行號x 8 +列號,你看看是不是?」
「咦,還真是這樣!」
「所以啊,反過來的話,行號就等于數(shù)組編號對8做整除,列號等于數(shù)組編號對8取余數(shù)。有時候我們在考慮一件事情的時候,如果暫時沒有答案,不妨換一個角度?!?p> 「嗯!」
隨機挑了幾個元素將老爹說的規(guī)律驗算了之后,我這才心悅誠服地點了點頭。
「其實還有更簡單的方法?!?p> 就在這時,老爹又笑著拋出了一個深水炸彈。
「……老爹,你真的是名副其實的坑閨女啊,既然有簡單的,為什么要繞這么大的圈子呢?」
我無語道。
「別先記著抱怨,一會兒等我說完了你可能就知道為什么了。」
「那好吧~」
我拖長了聲音,發(fā)出了自己的抗議。
「好,我接著買薯片的案例。
就在我們剛從超市出來的時候,你媽媽給我打了一個電話,說趙叔叔來我們家做客了,讓你給趙叔叔的女兒靈筠也買幾包薯片,當然了,還要給她帶幾包,于是我們又回超市買薯片。
因為你媽媽喜歡吃香焗番茄味道的薯片,而靈筠喜歡吃香烤原味,你喜歡吃的是紅酒牛排味的薯片,為了方便區(qū)分,于是你向收銀小姐姐要了兩個口袋,將香焗番茄味和香烤原味的薯片分別放到了不同的口袋中,這樣我們這兒就有三個口袋,分別是紅酒牛排味、香焗番茄味和香烤原味。
三個口袋提在手上很不方便,好在出門之前奶奶給了老爹一個布袋子,于是你就將這三個口袋一起放到了布袋當中?!?p> 「嗯,然后呢?這個不是很正常么?」
我點了點頭,毫不在意地問道。
「問題的關鍵就在這里,我之前跟你說過,數(shù)組其實就是一個口袋,只是它會給口袋里面的東西編號。
既然現(xiàn)實中口袋里邊能夠再裝口袋,那么C語言中呢?
設想一下,如果我們把地圖的每一行數(shù)據(jù)都放到一個口袋(數(shù)組)里面,這樣就會有8個口袋(數(shù)組),然后我們再用一個大口袋(數(shù)組)把這八個口袋(數(shù)組)裝起來,這樣大口袋中對小口袋的編號不就是行號么,每個小口袋里面的元素編號不就是列號了么?
這樣一來,獲取行號和列號就十分簡單了,不需要進行計算?!?p> 「居然還有這種好東西,那C語言中是如何表示那個大口袋的?」
我眼睛一下子亮了,如果真有這個東西的話,的確要省事很多。
「在說大口袋之前,要先給你介紹一個概念,也就是數(shù)組的維度。像我之前說的那個直接裝薯片的口袋,也就是在C語言中直接裝某種數(shù)據(jù)類型的數(shù)組,比如說:int array[10],char array[10],double array[10]這樣的被叫做一維數(shù)組。
而剛剛說的大袋子,也就是里面放著小袋子的數(shù)組,在C語言中則是一個數(shù)組里面裝的一維數(shù)組,這樣的數(shù)組就叫做二維數(shù)組。通過我們剛剛的分析,二維數(shù)組特別適合用來保存具有行和列這樣的表格數(shù)據(jù)。
二比如說我們要定義一個4行3列的int型二維數(shù)組,那么就是這樣的:int[4][3]。其實按照我們裝薯片的方式來解釋更容易明白,定義一個大袋子,可以裝4個小袋子,然后每個小袋子里面裝了三包薯片。
有一點是需要注意的,那就是無論是大袋子還是小袋子要裝幾個元素必須在定義的時候指定清楚,否則編譯器就會報錯?!?p> 「哦~,原來是這樣啊。那三維數(shù)組是不是一個超級大袋子,里面裝了幾個大袋子,然后每個大袋子里面又裝了幾個小袋子,每個小袋子里面裝了幾包薯片。按照一維數(shù)組、二維數(shù)組的規(guī)律來看,三維數(shù)組的表示方法應該就是:int[4][5][6]這種了吧?」
我摸著下巴推斷道。
「完全正確!其實從本質上來看,無論幾維數(shù)組,其實都是一維,只是元素的類型不同罷了。三維數(shù)組的元素類型是二維數(shù)組,二維數(shù)組的元素是一維數(shù)組,一維數(shù)組的元素是具體的數(shù)據(jù)。不過為了方便理解才引入了維度這個概念,而且大家都是這么描述數(shù)組的,所以我們也就沿用吧?!?p> 老爹摸了摸我的頭,笑著說道。
任煦之秋
嘗試了好多次,不能顯示多的空格,為了能夠對整齊好看,我也是費盡了心思,我太難了……在看的朋友冒個泡好么?總感覺自己在玩兒單機,謝謝