C++函數的三種傳遞方式爲:值傳遞、指針傳遞和引用傳遞數據結構
值傳遞:函數
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; }
指針傳遞:spa
void fun(int *x){ *x += 5; //修改的是指針x指向的內存單元值 } void main(void){ int y = 0; fun(&y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
引用傳遞:指針
void fun(int &x){ x += 5; //修改的是x引用的對象值 &x = y; } void main(void){ int y = 0; fun(y); cout<<<<\"y = \"<<y<<endl; //y = 5; }
1.值傳遞:有一個形參向函數所屬的棧拷貝數據的過程,若是值傳遞的對象是類對象或是大的結構體對象,將耗費必定的時間和空間。code
2.指針傳遞:一樣有一個形參向函數所屬的棧拷貝數據的過程,但拷貝的數據是一個固定爲4字節的地址。對象
3.引用傳遞:一樣有上述的數據拷貝過程,但其是針對地址的,至關於爲該數據所在的地址起了一個別名。blog
效率上講,指針傳遞和引用傳遞比值傳遞效率高。通常主張使用引用傳遞,代碼邏輯上更加緊湊、清晰。內存
引用傳遞作函數參數」是C++的特性,C語言不支持。class
例如:數據結構帶&與不帶&效率
帶&的是引用型參數,它是地址傳遞,其實參會隨着形參的改變而改變;不帶&的參數是通常參數,是值傳遞,其實參不會隨着形參的改變而改變。因此,結構改變,而且須要傳回這種改變的要用引用型參數,不然用通常參數。GetElem(L,i)只是找到第i個元素的值,線性表的結構並未發生任何改變,因此參數L前面不用加&。ListInsert(&L,i,e)是在線性表L的第i個元素處插入一個數值爲e的元素,線性表L的結構發生了改變,長度增長了,因此在L前必須加上&。若是不加,顯示L時,新增元素就顯示不出來,顯示L的長度,也仍然是增長之前的值,比實際長度少1.