1. 程式人生 > >C語言函式篇(二)形參和實參

C語言函式篇(二)形參和實參

參引數:形參和實參 -------------------------------
形參實現一種資料傳入的介面 ,由實參 拷貝 給 形參
拷貝!!!!!!!!!!!
拷貝1: void func(int tmp){ //我們的意圖是實現傳進來的引數 +1     tmp++; }
int mian(){     int a = 10;     func(a);     printf("%d\n",a);       //輸出結果還是 10, 並沒有實現我們需要的功能 } 解析:引數傳遞是拷貝的概念.由於函式設計的時候,形參是 int tmp, 執行的動作是將 a 的值 拷貝成 tmp 所以 ,傳遞後 tmp = 10, tmp++; tmp = 11     因為tmp 是由a 拷貝出來的,是副本的存在,改動副本並不會影響 a 資料本身,所以 a 的值並不會發生改變.
需求:我們確確實實想通過引數傳遞,來改變實參的內容. 拷貝2:     void func2(int *tmp){         (*tmp)++;     }
    int main(){         a = 10;         func2(&a);
        printf("%d\n",a);   //a = 11;
    } 解析:同樣是拷貝,為什麼func2 的實際讓實參發生了改變?      因為 func2 拷貝的是 a 的地址, 把a的拷貝給tmp,這時候 *tmp 指向的也是 int a這個空間 在操作*tmp的時候,就是直接對這個空間內的資料進行改變,所以讓a 的值發生了改變
func1 是 值傳遞 func2 是 地址傳遞
值傳遞 和 地址傳遞 本身不具備 某種特定的標籤 在引數傳遞的過程 只有拷貝兩個字 .
而拷貝什麼東西 ,其實是由我們人為設計的. 拷貝的是空間本身 ,就是建立空間副本,不會影響到原始空間,稱作 值傳遞 拷貝的是空間的地址, 就是將 指標A 拷貝成 指標B, 指標B指向的空間是和指標A指向的空間是一樣的,因為指標B是指標A的副本, 既然指標B能夠操作這個空間,那自然能夠改變這個空間裡面的內容.
總結: 值傳遞:    int func1(int tmp){}    在保護原始資料的時候用值傳遞  缺點:拷貝空間本身,而非地址,建立副本耗費資源,不靈活 地址傳遞: int func2(int *tmp){}     好處:傳遞引數靈活, 拷貝的是指標,拷貝內容少,指標只有 int大小 .
地址傳遞的 形參和實參彙總:
資料:                                         實參:                                     形參: 普通資料型別的 char/int/float/... a;       func(&a);                         func( char/int/float/... *tmp )                                  一維陣列        char a[10];                 func(a);                                func( char *tmp) 二維陣列        char a[2][3]                func(a);                                func( char (*tmp)[3] ) 指標陣列        char *a[10]                 func(a);                                func( char **tmp )