指針參數傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形參作爲被調函數的局部變量處理,會在棧中開闢內存空間以存放由主調函數傳遞進來的實參值,從而形成了實參的一個副本(替身)。值傳遞的特點是,被調函數對形參的任何操作都是作爲局部變量進行的,不會影響主調函數的實參變量的值(形參指針變了,實參指針不會變)。
引用參數傳遞過程中,被調函數的形參也作爲局部變量在棧中開闢了內存空間,但此時存放的是由主調函數放進來的實參變量的地址。被調函數對形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量(根據別名找到主調函數中的本體)。因此特點,被調函數對形參的任何操作都會影響主調函數中的實參變量。
【注:】指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以後不能改變。
(2)在C++中,函數的形參,什麼時候使用引用?什麼時候使用指針?什麼時候使用按值傳遞?
1 針對函數內部只使用傳遞的值而不做修改
(1)數據對象較小,如內置數據類型或小型結構體,則按值傳遞
void func(int );
(2)數據對象是數組,則只能使用指針,並將指針const指針
void func(const int *,int);//第二個參數爲數組長度
(3)數據對象是較大的結構體,則const指針或const引用都行
struct struc{…};
void func(const struc *);
或void func(const struc &);
(4)數據對象是類,則使用const引用
void func(const string &,);
2 針對函數內部不僅使用傳遞的值且要做修改的
(1)數據對象是內置數據類型,則使用指針
void func(int *);
(2)數據對象是數組,則只能使用指針
void func(int *,int);//第二個參數爲數組長度
(3)數據對象是結構體,則使用引用或指針
struct struc{…};
void func(struc *);
或void func(struc &);
(3)數據對象是類,則使用引用
void func(ostream &);
1.值傳遞:
void fun(int x)
{ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開闢的一塊臨時空間把y的值 送給了x;這樣也增加程序運行時間,降低了程序的效率 }
void main(void)
{ int y = 0; fun(y); cout<<\"y = \"<<y<<endl; //y = 0; }
2.指針傳遞:
void fun(int *x)
{ *x += 5; //修改的是指針x指向的內存單元值 } void main(void)
{ int y = 0; fun(&y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
3.引用傳遞:引用傳遞做函數參數”是C++的特性,C語言不支持”
void fun(int &x)
{ x += 5; //修改的是x引用的對象值 &x = y; }
void main(void)
{ int y = 0; //引用的實參必須初始化 fun(y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
例如:數據結構帶&與不帶&
帶&的是引用型參數,它是地址傳遞,其實參會隨着形參的改變而改變;
不帶&的參數是一般參數,是值傳遞,其實參不會隨着形參的改變而改變。