C++中的值傳遞 指針傳遞 和 引用傳遞

 

C++中參數傳遞有三種:傳遞參數值、傳遞參數地址、傳遞參數的引用。安全

1、概念分解函數

1. 值oop

2. 指針.net

  指針從本質上講 就是存放 變量地址的 一個變量, 在邏輯上是獨立的,它能夠被改變,包括其所指向的地址的改變和其指向地址中所存放的數據的改變。指針

3. 引用對象

  引用是一個別名,在邏輯上不獨立,它的存在具備依附性,因此引用必須在一開始就被初始化,並且在其生命週期中是不能改變的其引用的對象(即不能從新賦值,自始至  至終都只能依附於同一個變量)blog

2、概念詳解生命週期

1. 值傳遞:內存

  形參是實參的拷貝,改變形參的值並不會影響外部實參的值。get

  從被調用函數的角度來講,值傳遞是單向的(實參->形參),參數的值只能傳入,不能傳出;

  當函數內部須要修改參數,而且不但願這個改變影響調用者時,採用值傳遞。

2. 指針傳遞

  形參是指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做

3. 引用傳遞

  形參至關因而實參的「別名」,對形參的操做其實就是對實參的操做。

  在引用傳遞過程當中,被調函數的形式參數 做爲局部變量 在棧中開闢了內存空間,可是這時存放的是由主調函數放進來的實參變量的地址。

  被調函數對形參的任何操做都被處理成間接尋址,即 經過棧中存放的地址訪問主調函數中的實參變量。

  正由於如此,被調函數對形參作的任何操做都影響了主調函數中的實參變量。

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;

}

實際上,用「引用」能夠作的任何事情「指針」也可以作,可是爲何還要「引用「?

->指針太靈活,能夠毫無約束地操做內存中的任何東西,儘管指針功能強大,可是很是危險;

若是的確只須要借用下 某個 對象的 別名, 那麼就用引用,以避免發生意外。

 

 

Reference:

1. http://blog.csdn.net/htsnoopy/article/details/7070819

2. http://blog.csdn.net/zzuqqiu/article/details/5617263

3. http://blog.csdn.net/xiaocai0807/article/details/6526672

相關文章
相關標籤/搜索