網頁

2013年10月19日 星期六

C++ - use of reference(&) or pointer(*) in function parameters

Last Update: 2014/12/20 14:19+08
Type: Note


Intro


如何傳遞參數
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <map>

class Vec2D {
public:
 int x, y;
};




Content


測試程式
void pass_param(Vec2D v1, Vec2D *v2, Vec2D &v3) {
 printf("v1= %p, v2= %p, v3= %p\n", &v1, v2, &v3);
 v1.x = 110;
 printf("pass_param 1:\n");
 v1.print(); //110, 12
 v2->print(); //11, 12
 v3.print(); // 11, 12

 v2->y = 120;
 printf("pass_param 2:\n");
 v1.print(); //110, 12
 v2->print(); // 11, 120
 v3.print(); // 11, 120

 v3.x = 111;
 printf("pass_param 3:\n");
 v1.print(); //110, 12
 v2->print(); //111, 120
 v3.print(); //111, 120
}

int main(int argc, const char **argv) {
 Vec2D vec;
 vec.x = 11;
 vec.y = 12;

 pass_param(vec, &vec, vec);

 printf("main:\n");
 printf("v: %d, %d\n", vec.x, vec.y);

 return 0;
}

同一個vec用3種方法傳遞進去
v1: by value, v2: by pointer, v3: by reference

v1 是 call by value, 所以他會用 copy 的方法傳進去
也就是跟原本的物件已經無關了

v2 是 call by pointer
傳一個指標進去, 每當要操作時, 就跳到該指標所指向的物件

v3 是 call by reference
它所在的address, 跟 v2 是一樣的
所以對這個物件做修改, 會反映到原本的物件

Call by pointer 與 reference 看來是具相同的功能
為了直接修改函式呼叫前的變數
by reference 只有 C++ 才有(C 沒有)的功能
另外是 必需有接收值, 僅宣告會有compile error
int &c; //compile error
int c1 = 30;
int &c = c1; //OK
好處大概就是比 by pointer 方便
不知是否代表 by reference 可以少一次 memory access?



Reference


external: The Use of * and & in C/C++

沒有留言:

張貼留言