Related Posts Plugin for WordPress, Blogger...

2020年10月27日

【程式學習】在C語言裡,如何在函式中傳遞陣列_給CS50x_Week2的補充資料

cs50x第二週的課程中,已經提到了陣列。然而如果你已經寫過作業,肯定會對C語言的陣列感到很困擾。因為課程裡介紹陣列的部分太少了,使用者的練習也遠遠不夠,很難掌握陣列的原理。

於是我上網找補充資料,找到了李根逸博士的C語言教學影片,全套免費無私地放在Youtube上,就看了兩個禮拜了。李根逸博士的講解清楚扼要,不怕繁瑣地用不同例子說明,而且有超多練習可以實做,真是自學者的福音。


陣列的特性
在我這篇筆記裡,談到陣列有一個特性,是如果你在函式裡丟入陣列,可以透過函式直接改陣列的值,但是如果在函式丟入其他變數,則不會變動。可以看以下例子:
結果如下:
that wanaka tree

在上述例子中,我們分別寫兩個void函數(不會回傳值),將array陣列裡的數字分別+1,以及n的數字+1。但是印出來的結果,我們發現array陣列的數字都+1了,但是num變數的數字沒動。
這是因為當我們寫void函數時,丟入陣列,其實不是複製一份陣列進去,函數裡面的動作,會去改變原先的陣列。但是我們若丟入int變數,其實是複製一份值進去,不管函式裡面怎麼操作,原先的值是不會改變的。
此外,陣列也無法複製。假設假設有一個陣列為array[10],裡面有10個元素,現在要複製array[10]給new_array[10],我可以寫成下面這樣嗎?
當然也是不行的哦,只能用迴圈一個一個賦值過去。
在函式中傳遞陣列
底下使用一個小例子,簡介如何在函式中傳遞陣列
在上述跑亂數陣列的函式,我們迴圈設定為10次,因為我們在前面把陣列裡的值設定為10個。可是如果陣列有換,每次都得修改函式,能不能不要修改函式呢?
其實是可以的,例如我們可以把亂數陣列函式寫成這樣:
透過上述的例子,我們知道3件事實:
  • 陣列無法直接被複製
  • 在函式裡的參數丟入陣列,陣列因為無法被複製,所以函式裡的動作會直接修改原陣列
  • 函式無法回傳陣列
指標
在函式裡丟入陣列,如果不是複製值進去,那麼是丟入什麼?這裡就要談記憶體的位址。
有一個陣列如下:
int array[3] = {10, 20, 30};
that wanaka tree

每一段記憶體空間,都有一個編號,這個編號又代表了一個記憶體位址,每次執行時,記憶體位址都可能不同。如果array[0]的起始位置是10000,而我的編譯器給4個位元組作為一個整數的記憶體空間,那麼array[1]就會是10004,array[2]就是10008。
在函式傳遞陣列,其實不會把陣列複製一份,所以函式必須知道陣列的記憶體位址,也就是指標(pointer)。
對於陣列的補充介紹就到這邊,更多知識大家可以去看李根逸博士的影片。
Happy coding!

沒有留言:

張貼留言

謝絕廣告,感恩