引數中,值傳遞 指標傳遞 引用傳遞的區別

2021-08-21 13:08:45 字數 1702 閱讀 7986

值傳遞:

形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),賦值完畢後實參就和形參沒有任何聯絡。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

#include//值傳遞示例

void swap(int a,int b)

; //函式呼叫後a和b的值進沒有達到交換目的

int main()

指標傳遞:

形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作。

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。為什麼說傳位址也是一種傳值呢?因為傳位址是把實參位址的拷貝傳遞給形參。還是一句話,傳位址就是把實參的位址複製給形參,複製完畢後實參的位址和形參的位址沒有任何聯絡。那麼在函式內改變指標指向,並不能影響函式外的指標例項。但是在函式裡改變指標所指向的變數的值時,主函式實參指標所指向的變數的值會改變。

#include//指標傳遞示例

void swap(int *a,int *b)

int main()

引用傳遞:

&表示引用實參,即代表形參是實參的乙個別名。操作引用變數就是操作實參變數。這是c++語法寫法,標準c是不支援這種寫法的。

在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

#include//引用傳遞示例

void swap(int &a,int &b)

; //函式呼叫後a和b的值進行了交換

int main()

引用和指標的區別:

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名,引用初始化後不能改變指向。使用時,引用更加安全,指標更加靈活。

初始化。引用必須初始化,且初始化之後不能呢改變;指標可以不必初始化,且指標可以改變所指的物件

空值。指標可以指向空值,不存在指向空值的引用。當引用或者指標作為引數傳遞的時候,拿到乙個引用的時候,是不需要判斷引用是否為空的,而拿到乙個指標的時候,我們則需要判斷它是否為空。這點經常在判斷函式引數是否有效的時候使用。

引用和指標指向乙個物件時,引用的建立和銷毀不會呼叫類的拷貝建構函式和析構函式。delete乙個指標會呼叫該物件的析構函式,注意防止二次析構。

引用和指標與const。存在常量指標和常量引用指標,表示指向的物件是常量,不能通過指標或者常量修改常量;存在指標常量,不存在引用常量,因為引用本身不能修改指向的特性和與指標常量的特性相同,不需要引用常量。

函式引數傳遞時使用指標或者引用的效果是相同的,都是簡潔操作主調函式中的相關變數,當時引用會更加的安全,因為指標一些修改指向,將不能影響主調函式中的相關變數。所以引數傳遞時盡可能使用引用。

sizeof引用的時候是物件的大小,sizeof指標是指標本身的大小。

引用和指標的實現是相同的,「引用只是乙個別名,不會佔記憶體空間」的說法是錯誤的,實際上引用也會再用記憶體空間。

C 中值傳遞 指標傳遞 引用傳遞的總結

1.值傳遞 void swap int a,int b int main int x 1 int y 2 swap x,y cout 輸出結果是2,1 2,1。實參x,y,形參a,b的位址同上,但是a,b的內容分別為0xffbef938 x的位址 0xffbef934 y的位址 a也就是0xffbe...

C 中值傳遞 指標傳遞 引用傳遞的總結

c 中值傳遞 指標傳遞 引用傳遞的總結 指標傳遞和引用傳遞一般適用於 函式內部修改引數並且希望改動影響呼叫者。對比值傳遞,指標 引用傳遞可以將改變由形參 傳給 實參 實際上就是直接在實參的記憶體上修改,不像值傳遞將實參的值拷貝到另外的記憶體位址中才修改 指標 引用傳遞的另外一種用法是 當乙個函式實際...

c 中值傳遞和引用傳遞

物件在方法間傳值,傳遞的是物件的值,或者這個物件的引用的副本 首先建立乙個物件 public class orderinfo 建立乙個方法去改變這個物件 private void change orderinfo order 然後通過方法的呼叫檢視變化 private void btnchange ...