C 語言學習筆記 (九): 陣列引數傳遞機制
學習書籍:C 語言學習手冊 第四版。作者: 洪維恩
這是一篇記錄自己學習 C 語言的過程,算是給自己看的筆記,所以這裡面的內容,是我整理書中我認為重要的部分,然後用自己的方式重新寫一遍,如果有圖,我會理解完,再自己畫出來,內容肯定會和課本上有出入,若有錯誤,或是理解錯的地方,希望能讓我知道。
陣列作為引數傳遞至函數
離上一篇學到陣列用法已經過了快一個月,絕對不是我懶XD,這次要來看看陣列怎麼在函數中傳遞。
函數在傳遞引數時,都是用傳值呼叫 (call by value) 的方式,救世會先將數值複製到函數的記憶體中,可以想成是函數的區域變數,所以不會改變主程式李變數值。
而當函數在傳遞陣列時,陣列的長度可能會很大,為了效率考量只會傳遞陣列在記憶體中的位址,不會複製陣列裡的所有數值在傳遞給函數使用。
用一維陣列當作函數引數的用法
傳回值型態 副函數名稱(資料型態 陣列名稱[]);
int main(){
...
資料型態 陣列名稱[個數];
...
副函數名稱(陣列名稱[]);
...
return 0;
}
傳回值型態 副函數名稱(資料型態 陣列名稱[]){ //中括號不可填元素數量
...
}
一個簡單範例
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void func(int arr[]) {
int i;
printf("\nfunc\n");
for (i=0; i<SIZE; i++)
printf("arr[%d]=%2d, arrd=%p\n", i, arr[i], &arr[i]);
}
int main() {
int i;
int A[SIZE] = {0, 1, 2, 3, 4};
printf("\nmain\n");
for (i=0; i<SIZE; i++)
printf("arr[%d]=%2d, arrd=%p\n", i, A[i], &A[i]);
func(A);
return 0;
}
程式執行的結果 (每次存放位址都會改變)
main
arr[0]= 0, arrd=000000000061FE00
arr[1]= 1, arrd=000000000061FE04
arr[2]= 2, arrd=000000000061FE08
arr[3]= 3, arrd=000000000061FE0C
arr[4]= 4, arrd=000000000061FE10
func
arr[0]= 0, arrd=000000000061FE00
arr[1]= 1, arrd=000000000061FE04
arr[2]= 2, arrd=000000000061FE08
arr[3]= 3, arrd=000000000061FE0C
arr[4]= 4, arrd=000000000061FE10
結語
雖說陣列傳遞的機制不是很難理解的東西,卻是我個人覺得是非常重要的觀念,因為工作關係現在都在接觸 C/C++,其實常常用到陣列在函數之間的傳遞,弄懂之後就可以更輕鬆去設計引數,下一篇就是個人最不擅長的指標QQ。
題外話 – 雖然現在是邊工作邊學習,但是越來越覺得學習 C 語言才是最重要的,之前 Python 用慣了,反而對工作沒什麼幫助,雖然現在也需要接觸 Python,但是真正設計程式需要的技巧跟觀念還是 C 語言才是最有幫助。
3 則留言
wien hong
您的文章寫的真是不錯,真是用心,太佩服了~
我自己也會寫些給自己看的筆記,只是我沒有寫的您這麼詳細,也比較草率,大概只有我可以看的懂吧
yang10001
很高興你能喜歡,不過我都是看書現學現賣XD
wien hong
貌似大大的Python學的比C來的早。我是剛好相反,以前學過C,不過也差不多忘光了,藉由您的文章剛好可以回憶一下。最近才開始學Python,不過都不專精。以後有機會還得向大大您多多學習。