C 函式的值傳遞和位址傳遞的區別

2021-09-02 10:56:19 字數 1721 閱讀 8104

c++函式的值傳遞和位址傳遞的區別

對於c++早期學習中指標的學習與運用可謂是難點與重點,雖然概念比較簡單(只是*p指向某乙個位址,通過指標形參可以獲取所指向位址的儲存資訊)但是就其的幾種基本使用形式,如果不花大把功夫初學者很難理解。

當函式的形參為基本型別變數、結構體型別變數、類型別變數時,函式的引數傳遞方式屬於值傳遞,實參為相應的變數、常量、表示式等。值傳遞是一種單向傳遞,只能把實參傳遞到形參,對形參操作不會影響實參的值.

void

fun1

(int

*x,int

*y)

函式fun1就是值傳遞,在這裡完全不必把它複雜化理解,x=y就是指標名稱的交換。(此處可以用筆略做推導就十分清楚了)呼叫函式1輸出的實參不變形參改變。值傳遞不會影響主函式實參的值。

當函式的形參是某種型別的指標時,實參為相應的位址時,函式引數傳遞的是位址。傳遞方式是位址傳遞,位址傳遞時實參也可以是儲存了某個位址的指標變數;既可以操作指標也可以操作指標所指向的記憶體空間。

void

fun2

(int

*x,int

*y)

函式fun2就是位址傳遞,*x=*y是指標的轉遞(就是對指標所指向的記憶體空間進行交換或傳遞)呼叫函式2時輸出結果形參和實參都發生了改變。

void

fun3

(int

*x,int

*y)

2.2:對位址傳遞稍作改進fun3:其實使用起來與fun1幾乎沒有差別,但是fun1是指標名稱交換指向不變,而fun3是指標指向改變而指標名稱不變。二者呼叫輸出結果一毛一樣。但屬於位址傳遞。

2.3:位址傳遞可能會改變主函式實參的值。

void

fun4

(int

*x,int

*y)

2.3:注意fun4編譯過程不會報錯,但是不能完成傳遞,不可選用這個方式傳遞。

3函式的引用傳遞定義:函式的引數是引用傳遞時,形參為某種型別的變數引用,實參為相應的變數。根據引用的概念,引用傳遞時,形參是對實參的重新命名,形參和實參是同一記憶體空間的兩個名稱。

如fun5,在呼叫fun5時,將變數a,b重新命名為x,y,現在a,x是同乙個記憶體空間的名稱,所以此時若a,b交換則x,y交換,x,y交換則a,b交換。

void

fun5

(int

&x,int

&y)

在這裡注意&x,&y,用的&是引用符合,不是取位址符合。並且引用傳遞中實參與形參必須是同型別的變數,不能是位址或常量或者其他型別的變數。引用傳遞會影響主函式的實參的值。

#include

using

namespace std;

void

fun1

(int

*x,int

*y)void

fun2

(int

*x,int

*y)void

fun3

(int

*x,int

*y)void

fun4

(int

*x,int

*y)void

fun5

(int

&x,int

&y)int

main()

C 函式位址傳遞和值傳遞區別

目錄 c 位址傳遞和值傳遞區別 1 位址傳遞vs值傳遞 2 演示 相當於通過尋找位址 傳遞,然後 解引用,修改變數的值。void swap int p1,int p2 swap a,b 呼叫值傳遞 之間進行形參內部的值的改變,不會改變實參,只會影響形參。相當於在函式內部做了賦值的操作。void sw...

C 值傳遞和位址傳遞

在c 呼叫函式時,會存在值傳遞和位址傳遞,也叫 傳引用和傳值 正好用到這方面內容,因此做個總結,加深一下理解,如果有不到位或者不準確的地方,請小夥伴們多指教。1 位址傳遞時,形參和實參是同乙個變數,即使用相同的記憶體空間,二者有相同的位址。而傳值時二者位址不同 2 位址傳遞時,由於沒有新建變數,所以...

函式引數的值傳遞和位址傳遞

利用乙個小例子說明,見 includevoid f1 int pp void f2 int pp 以上函式中,接收資料的參量都是pp,而不會是 pp或者 pp int f3 int pp int main void p a printf 1 d n p 開始值為4 f1 p printf 2 d n...