函數傳入參數模式 以 C 語言而言,只有兩種,傳值模式與傳址模式。C++則增加傳參考模式。

1.傳值模式
定義:函數名稱(資料型態 變數名稱)

範例 f(int x)
函數名稱為 f
資料型態為 int
變數名稱為 x

傳值模式無法改變傳入參數的內容

呼叫方式
函數名稱(傳入變數名稱)
範例 f( x )



2.傳址模式
定義:函數名稱(資料型態 指標變數名稱)

範例 f(int *x)
函數名稱為 f
資料型態為 int
指標變數名稱為 x

傳址模式可以改變傳入參數的內容

呼叫方式
函數名稱(傳入變數位址)
範例 f( &x )
實務範例
typedef struct complex Complex;
struct complex{
int x;
int y;
};

double length(Complex a){
return(sqrt(a.x*a.x+a.y*a.y));
}

void product(Complex *a, int k){
a->x*=k;
a->y*=k;
}

main(){
Complex a;
a.x=3;a.y=-5; //3-5i
product(&a,4); // 4*(3-5i)
printf("length=%g , 4*a=%d%c%di\n",length(a) , a.x , (a.y>=0?"+":"-"),(a.y>=0?1:-1)*a.y);
}


c++ 增加傳參考模式,類似傳址模式,可以更改傳入參數的內容。

3.傳參考模式
定義:函數名稱(資料型態 &變數名稱)

範例 f(int &x)
函數名稱為 f
資料型態為 int
變數名稱為 x

傳參考模式可以改變傳入參數的內容

呼叫方式
函數名稱(傳入變數名稱)
範例 f( x )


實務範例
#include <iostream>
#include <math.h>

using namespace std;

typedef struct vector {
float x,y;
}Vector;

float length(Vector a){
return(sqrt(a.x*a.x+a.y*a.y));
}

void unitvector(Vector &a){
int l=length(a);
a.x/=l;
a.y/=l;
}

main(){
Vector a;
a.x=3;a.y=-4; // (3,-4)
unitvector(a); //(3,-4)/abs(3,-4)
printf("unit vector = <%g , %g> , length=%g\n", a.x , a.y, length(a));
}