函數直接傳遞值(變量)
這種方式傳給形參的是變量的值,傳遞是單向的。如果在執行函數器件形參的值變了,不會回傳給實參。也就是說如果想要實現一個這樣的功能:調用函數後實參的值隨之改變。顯然此方式無法實現。
舉個例子:
執行swap函數後,想要主函數內的變量值變化,用上述方式寫出代碼:
#include <iostream>
using namespace std;
int main()
{
void swap(int ,int);
int i =3,j = 5;
swap(i,j);
cout<<"i="<<i<<endl<<"j="<<j<<endl;
getchar();
return 0;
}
void swap(int a,int b)
{
int temp;
temp = a;
a =b;
b= temp;
}
運行結果:
i = 3
j = 5
顯然值沒有帶回,i和j的值在執行後沒有發生變化。
函數傳遞引用(利用&)
舉例說明:
#include <iostream>
using namespace std;
int main()
{
void swap(int & ,int&);
int i =3,j = 5;
swap(i,j);
cout<<"i="<<i<<endl<<"j="<<j<<endl;
getchar();
return 0;
}
void swap(int &a,int &b)
{
int temp;
temp = a;
a =b;
b= temp;
}
運行結果:
i = 5
j = 3
第13行,形參是聲明的引用,注意這個引用並沒有初始化,這就是上面提到的特例。而在第7行調用函數的過程中,實現了引用的初始化,這是傳入的實參就是變量,而不是數值,所以做到了真正意義上的“變量傳遞”。
以上借鑑:
https://blog.csdn.net/chaipp0607/article/details/60151813
兩者區別
除了以上介紹的傳遞參數時的區別,我在刷LeetCode時發現兩者性能也有很大區別。
當要傳遞的參數是string
類型時,兩者的運行時長差異很大!
以No.126 LeetCode題目 “成語接龍II”爲例,若比較函數寫成:
bool checkDifference(string str1, string str2)
則顯示超出時間限制
bool checkDifference(string& str1, string& str2)
則通過測試。
在網上查閱一些資料後,發現是如下的原因:
從傳遞效率上來說:這裏所說傳遞效率,是說調用被調函數的代碼將實參傳遞到被調函數體內的過程。對於內建的int char short long float等4字節或以下的數據類型而言,實際上傳遞時也只需要傳遞1-4個字節,而使用指針傳遞時在32位cpu中傳遞的是32位的指針,4個字節,都是一條指令,這種情況下值傳遞和指針傳遞的效率是一樣的,而傳遞double long long等8字節的數據時,在32位cpu中,其傳值效率比傳遞指針要慢,因爲8個字節需要2次取完。而在64位的cpu上,傳值和傳址的效率是一樣的。再說引用傳遞,這個要看編譯器具體實現,引用傳遞最顯然的實現方式是使用指針,這種情況下與指針的效率是一樣的,而有些情況下編譯器是可以優化的,採用直接尋址的方式,這種情況下,效率比傳值調用和傳址調用都要快,與上面說的採用全局變量方式傳遞的效率相當。
在我的64位電腦上,string類型時佔28個字節,因此傳遞參數時用指針會快很多,所以函數要用引用傳遞。