好,再下來我們要講解多維陣列的時候參數要怎麼傳。
那這裡的話就要特別注意。多維陣列的話比較複雜。我們先看一個簡單的語句。我們先把這個matrix
這個matrix印出來。我們這邊我們認為他是一個integer,整數的陣列。
第一維入4、第二維入3。然後我們說你要印哪一個。 i直接給我我就把他印出來。
所以這邊很簡單。 a你到底要印哪一個 這邊是i跟j所以a、i、j印出來那值是多少咧?印這個
所以各位可以對照著看。這個會對應到這個,然後 i會對應到這裡,j會對應到這裡。印出來就結束了。
然後我們組成式也要宣告array是3、4。然後我們把它讀進來。在這裡我們特別把它
那個每一個每一個這樣讀進來。然後這邊的話我們為了說明事情我們就從0一直到11,總共有12個元素。
因為第一個這邊是有3這邊有4.所以乘起來剛好12個。
然後咧我們開始印出來。第一次我們用那個
array。 a2、1把它印出來。然後我們 需要這個,然後我們就叫這個matrix去印,matrix說,array2、1把它印出來
這邊已經2、1,這邊已經2、1.那第二次我們一定要按0、2。叫array0、2把它印出來。然後
print_matrix也是叫他印0、2。我們期待說這個東西應該會 有一樣的結果。但是注意到我們這邊有特別
故意把他寫錯。這邊是3、4,這邊是4、3。
那會是什麼樣的情況咧?所以我們傳遞多維陣列必須注意這個形式參數及實際參數的一致性。
這個必須注意否則他位置容易算錯。等一下我們會說。
形式參數a的宣告是[4][3],而形式參數array的宣告是[3][4]
我們這邊說是[4][3],這邊說是[3][4]
那在計算位置的時候這樣就會發生一些奇怪的事情。比方我們輸入 是這樣1、2、3、4、5、6、7、8、9、10、11.這樣把他輸進去,
我們在array[2][1]的時候輸出是9,但a數出來的卻是7
這就很奇怪了。你看,array是在哪裡輸出來?array是在組成式的時候輸出來
他跟在函式print_matrix裡面印出來的東西居然會不一樣。這是什麼道理
我們如果實際畫個圖就可以理解。在記憶裡頭他都是連續的,只有12個
main program認為他是3、4是這樣的。就是說裡面1、2、3、4、5、6、7、8、9、10、11 所以這個時候你叫他印2、1
他位置去算一下他覺得是這個。因為2在這裡 1在這裡
因為你當初宣告的時候第一維入的是3,第二維入的是4.確認一下
第一維入的是3,第二維入的是4
所以他當然認為你的2、1是在這裡,所以它印出9來
但是在print_matrix來講,它認為這邊是
4、3.所以你叫他印2、1他就印個7出來。
因為他認為這個就是2、1.雖然在記憶裡頭他是排連續的,但是
你這看的角度不一樣就讓同樣的2、1出來不同的結果。
所以我們再回去看一下這個code 這邊我是讓他印2、1.這邊也是讓他印.那答案居然會不一樣
那道理實其實蠻簡單。因為我這邊宣告的是3、4
這邊array宣告[3][4]實際上在形式參數這邊宣告其實就是[4][3]
所以你在計算位置的時候會算錯。
那在第12行的時候,這邊在第12行的時候
他在印這個的時候他會印出來,他會按照這個想法印
它會這邊我要印9,這邊的話就印7出來。那比較有趣的就是說
第二個就完全一樣了。 你印[0][2]他也是2,這邊印[0][2]他也是2.這是什麼道理
這其實蠻簡單的。你如果這邊來看[0][2他是2.這邊來看[0][2]他也是2。因為剛好在第0排
在第0排。所以這個地方就沒有問題。這是剛好,是湊巧。
那如果是[2][1]就會出事情。所以這件事情很重要就是告訴我們說
我們必須避免這種問題。就是說你在這裡頭宣告就不一樣。
那印出來的結果就會不一樣。那借由這個例子我也想說明就是說 事實上陣列裡頭它計算位置,就所謂定值的方法
就是之前我們也講過前面這個維度乘上
後面這個維度再加上後面的維度。比如說像剛剛的話一個算出來會是7,一個算出來是9.
那你可以把它想像成就是說主程式
跟print_matrix這個副程式對同樣的記憶體,這是同樣的記憶體,事實上都是這樣子
永遠都是長這樣的。它的解讀不同。意思就是說它認為記憶體應該是這樣,他認為陣列應該是這樣的
就造成剛剛那個問題。所以這個要特別注意。所以在寫程式的時候,要特別注意說
尤其在傳這種多維的時候要特別小心。這邊必須一致讓這個結果才會正確。