2014年3月13日 星期四

C語言中的傳址函數

一般學C語言常會聽到傳值函數(Call by value)、傳址函數(Call by value of point or Call by address),我們較常用到的副程式有回傳值一般稱傳值函數,如下

double calAver(double x, double y),其副程式將會回傳一個平均值的結果,稱傳值函數(Call by Value)


這邊探討另一種為傳址函數,其說明副程式如下

Example

x = 100 ; y = 200;
swap_by_value(x,y);
swap_by_address(&x,&y);

void swap_by_value(int a, int b)
{
  int= temp;
  temp = a;
  a =  b;
  b = temp;
}

其執行時a、b值會互相交換,但返回主程式時,a、b的值還是保持原來值(x=100,y=200)
,但利用傳址函數則不會產生此問題。

void swap_by_address(int *a ,int *b)
{
  int= temp;
  temp = *a;
  *a =  *b;
  *b = temp;
}

原因在於傳址函數是利用位址的方式進行,假設記憶體位址為x = 0x04 ,  y = 0x08
 swap *a值存放為x的記憶體位址、*b值存放y的記憶體位址
而由此範例可知經Call by address傳址才會使兩數交換,但是透過位址方式在交換

Ref
1.http://wp.mlab.tw/?p=176
2.指標的藝術







沒有留言:

張貼留言