close

寫過VB就知道Function輸入時可選擇ByVal(傳值)或ByRef(傳址)
兩者差別就是ByVal變數在Function內的值與傳入的變數無相關,也就是在Function內怎麼變動,傳進來的那個變數依然不變
ByRef變數,在Function內改變變數值,呼叫者傳入的變數就跟著改變(兩者同步)
所以介紹這兩種Function輸入方式在C的實現方式

傳值 (By Value)

傳值類型就跟上一個介紹的輸入值相同,就是輸入一個變數,變數會複製外界傳入的值到該宣告變數,然後任其改變也不會影響外面的變數。

範例 傳值 外界變數不改變

#include<stdio.h>
int callbyVal(int a)//一般輸入類型
{
    a=a+100;
     printf("function a=%d\n",a);
    return a;//將處理後的值回傳
}
int main()
{
    int b=900;
    int returnVal=callbyVal(b);//把b帶入(複製到)function輸入值的a,在接收回傳
     printf("main b(input):%d\nreturn value:%d",b,returnVal);//這時候外面的b並不隨func改變
}

TIY

傳址 (By Adress/By Reference)

這種方法就可以同時改變外界傳入的變數內容,也就是輸入值輸入後,仍與外界的輸入變數內容同步
但是C語言的Function其實全部都是傳值的類型,也就是把外界傳入值複製到輸入值輸入的變數內,跟外界完全分離,所以只好藉由別的方法來實現

在Function介紹中,我們知道Function有輸入值,可以是任意變數型態,當然也包含"指標(Pointer)",在Pointer介紹中,我們又知道經過*運算子的位址完全等同於原始變數,所以在輸入值宣告為Pointer的類型時,可以藉由*來存取得該變數並且直接修改該變數且function呼叫者的變數內容也會跟著改變,就達成了內外變數內容同步的目的。

範例 外界變數跟著改變

#include<stdio.h>
int callbyVal(int*a)//指標類型輸入(將地址輸入,在尋找該變數)
{
    *a=*a+100;
     printf("function a=%d\n",*a);
    return *a;
}
int main()
{
    int b=900;
    int returnVal=callbyVal(&b);//用b的位址輸入
     printf("main b(input):%d\nreturn value:%d",b,returnVal);//這時候外面的b隨a改變
}

TIY

arrow
arrow

    繩繩 發表在 痞客邦 留言(0) 人氣()