用C寫程式的最大缺點就是,沒有內建一堆好用的 library 讓你去 import 並且直接地使用,所以,C/C++的許多開發者都要自幹或者是去網路上找一些能解決目前所碰到的問題的程式碼來用,或者是自幹一個。
先前因為學校課程的關係,寫了很多的 Java ,結果導致我使用 C 語言時產生一些困擾。因為Java幫開發者寫好了非常多的方法與物件,開發者可以直接引用、建立好物件並打上相應的方法名稱後便可以直接地使用,相當方便。
不過單晶片微控制器的開發上,目前來講很少有人採用java 來開發,一來是缺少相應的編譯器,二來是它過於笨重,不適合在低時脈的微控器上執行。所以,單晶片的開發還是繼續使用有點過時但萬能的C語言(少數採用C++)來開發。
今天,要來向各位介紹的是,如何把陣列當作一個參數在函式中傳遞。
在C語言中,陣列的傳遞並沒有辦法如 Java 或 C# 這類先進的程式語言來得方便。C無法直接地把整個陣列當作物件放入函式中傳遞,他僅能以指標的方式傳遞。也就是說,如果你用下面的方式進行傳遞…
1 2 3 4 5 6 |
int b[3]; void array_trans(int a[]) { b[] = a[]; } |
那只會得到一個結果,就是編譯錯誤。
而如果只傳送指標:
1 2 3 4 5 6 |
int b[3]; void array_trans(int *a) { b = a; } |
就只剩下第一個元素能夠傳到函式之中,以及編譯錯。(以上只是示範)
解決方法:同時傳送指標位址與長度
1 2 3 4 5 6 7 8 |
void array_trans(int *a, int array_size) { for (int i = 0; i < array_size; i++) { b[i] = a[i]; } } |
其實還有其他種解法,例如建一個 Struct 、放上特殊結尾…等等。不過,我個人認為這個解法是最容易理解的,維護上也很容易直接的聯想起這是做什麼用的。寫程式嘛,別自己為難自己,弄了一個很詭異的演算法,哪天開起來就不認識了 XD
參考資料: