C/C++

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

    您的文章寫的真是不錯,真是用心,太佩服了~
    我自己也會寫些給自己看的筆記,只是我沒有寫的您這麼詳細,也比較草率,大概只有我可以看的懂吧

  • wien hong

    貌似大大的Python學的比C來的早。我是剛好相反,以前學過C,不過也差不多忘光了,藉由您的文章剛好可以回憶一下。最近才開始學Python,不過都不專精。以後有機會還得向大大您多多學習。

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *