概念詳解ios
1. 值傳遞:安全
形參是實參的拷貝,改變形參的值並不會影響外部實參的值。函數
從被調用函數的角度來講,值傳遞是單向的(實參->形參),參數的值只能傳入,不能傳出;spa
當函數內部須要修改參數,而且不但願這個改變影響調用者時,採用值傳遞。指針
2. 指針傳遞code
形參是指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做對象
3. 引用傳遞blog
形參至關因而實參的「別名」,對形參的操做其實就是對實參的操做。內存
在引用傳遞過程當中,被調函數的形式參數 做爲局部變量 在棧中開闢了內存空間,可是這時存放的是由主調函數放進來的實參變量的地址。qt
被調函數對形參的任何操做都被處理成間接尋址,即 經過棧中存放的地址訪問主調函數中的實參變量。
正由於如此,被調函數對形參作的任何操做都影響了主調函數中的實參變量。
3、引用和指針 對比
1. 相同點
都是地址的概念;
指針指向一塊內存,它的內容是所指內存的地址;
引用則是某塊內存的別名。
2. 不一樣點
指針是一個實體,而引用僅是個別名;
引用只能在定義時被初始化一次,以後不可變;指針隨時可變;
const:引用只有 const int& a;(引用所指向的值不能夠變);沒有int& const a;(引用自己即別名不可變,這是固然的,因此不須要這種形式);指針均有;
引用不能爲空,指針能夠爲空;
引用是類型安全的,而指針不是;(引用比指針多了類型檢查)
sizeof 引用 的到是所指向的變量(對象)的大小,而sizeof 指針獲得的是指針自己的大小
4、應用
引用傳遞的性質像 指針傳遞,可是書寫像 值傳遞。
值傳遞:
void Func1(int x)
{
x = x+1;
}
指針傳遞:
void Func1(int *x)
{
*x = *x +1;
}
引用傳遞:
void Func1(int &x)
{
x = x+1;
}
實際上,用「引用」能夠作的任何事情「指針」也可以作,可是爲何還要「引用「?
->指針太靈活,能夠毫無約束地操做內存中的任何東西,儘管指針功能強大,可是很是危險;
若是的確只須要借用下 某個 對象的 別名, 那麼就用引用,以避免發生意外。
如下代碼很好的說明了問題
1 #include<iostream> 2 3 using namespace std; 4 5 //值傳遞 6 void change1(int n){ 7 cout<<"值傳遞--函數操做地址"<<&n<<endl; //顯示的是拷貝的地> 址而不是源地址 8 n++; 9 } 10 11 //引用傳遞 12 void change2(int & n){ 13 cout<<"引用傳遞--函數操做地址"<<&n<<endl; 14 n++; 15 } 16 //指針傳遞 17 void change3(int *n){ 18 cout<<"指針傳遞--函數操做地址 "<<n<<endl; 19 *n=*n+1; 20 } 21 int main(){ 22 int n=10; 23 cout<<"實參的地址"<<&n<<endl; 24 change1(n); 25 cout<<"after change1() n="<<n<<endl; 26 change2(n); 27 cout<<"after change2() n="<<n<<endl; 28 change3(&n); 29 cout<<"after change3() n="<<n<<endl; 30 return true; 31 }
結果以下
qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ g++ -o tate1 tate1.cpp qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ ./tate1 實參的地址0x7ffd1ee21884 值傳遞--函數操做地址0x7ffd1ee2186c after change1() n=10 引用傳遞--函數操做地址0x7ffd1ee21884 after change2() n=11 指針傳遞--函數操做地址 0x7ffd1ee21884 after change3() n=12