2016年2月27日 星期六

C/C++所提供的函式參數傳遞方式:

1.Call by value 傳值
2.Call by address傳址 (與1.不同在一個裝"變數" 一個裝"地址")
ex:

void function (int *x, int *y);
      function(&a,&b); // or function(a,b);
      //相當於 int *x=&a; int *y=&b;
3.Call by reference 傳參考 (取別名,但還是存取同樣空間)
ex:

void function (int &x, int &y);
      function (a,b);
      //相當於 int &x=a; int &y=b;

範例一、
int gint = 0; //全域變數
void changePtr (int *pInt)
{
    pInt = &gint; //將全域變數放入
}
void main ()
{
    int local_int = 1; 
    int *localPtr = &local_int;
    changePtr (localPtr); //期望
    printf ("%d\n", *localPtr);
}

以上為2.的實現,printf出來的還是1,因為傳進去的地址放在另一個較pInt的變數裡,就 pInt 和 localPtr 來說,兩個是一樣的只是名子不同。所以說把 gint 的位置放入 pInt 影響不到 localPtr 。

範例二、
int gint = 0;
void changePtr (int **pInt)
{
    *pInt = &gint;
}
void main ()
{
    int local_int = 1;
    int *localPtr = &local_int;
    changePtr (&localPtr);
    printf ("%d\n", *localPtr);
}

以上為利用雙指標指向存放的變數做修改所以輸出是0。

沒有留言:

張貼留言