說c語言中函式值傳遞與地址傳遞的方法

時間 2021-08-30 10:38:27

1樓:憤怒de翔小果

先舉個簡單例子:

#include

using namespace std;

void add1(int *a)

void add2(int a)

int main()

輸出:2 5

這兩個自加函式中,add1是指標傳遞,add2是數值傳遞,在呼叫add2(y)時,系統是先建造一個int型變數a,再將y的值傳給a(此時y和a是兩個不同地址的變數,只是兩者值相同),然後a++,卻對y沒有任何操作,故在函式呼叫結束後,釋放a,而y沒任何變化;

在呼叫add1(&x)時,系統先建造int型指標a,然後將實參x的地址傳給了指標a,故此時a與&x是指向同一地址,即共享統一資料,當對地址a內的資料進行操作,就是對x進行操作。a++時自然也對x++,當函式呼叫結束,指標a釋放掉,x的值此時已經發生了變化。

這就是兩者不同,地址傳遞的引數都是指標型別,於數值傳遞不一樣。

至於選擇那種傳遞,就要看這個程式的具體目的和功能了,一般要對引數進行修改的要用地址傳遞,而只是呼叫引數的資料進行其他計算並不需要修改資料本身宜用數值傳遞。

還有什麼不明白嗎

2樓:摯愛和你共亨

先舉個簡單例子:

#include

using namespace std;

void add1(int *a)

void add2(int a)

int main()

輸出:2 5

這兩個自加函式中,add1是指標傳遞,add2是數值傳遞,在呼叫add2(y)時,系統是先建造一個int型變數a,再將y的值傳給a(此時y和a是兩個不同地址的變數,只是兩者值相同),然後a++,卻對y沒有任何操作,故在函式呼叫結束後,釋放a,而y沒任何變化;

在呼叫add1(&x)時,系統先建造int型指標a,然後將實參x的地址傳給了指標a,故此時a與&x是指向同一地址,即共享統一資料,當對地址a內的資料進行操作,就是對x進行操作。a++時自然也對x++,當函式呼叫結束,指標a釋放掉,x的值此時已經發生了變化。

這就是兩者不同,地址傳遞的引數都是指標型別,於數值傳遞不一樣。

至於選擇那種傳遞,就要看這個程式的具體目的和功能了,一般要對引數進行修改的要用地址傳遞,而只是呼叫引數的資料進行其他計算並不需要修改資料本身宜用數值傳遞。

3樓:

傳值呼叫的特點:1形參與實參佔用不同的記憶體單元2單向傳遞(在被調函式中無法改變主調函式中的任何變數值)注意:函式呼叫時,實參的值是基本資料型別、結構體資料型別,即整型、實型、字元型、陣列元素等,可以是常量、變數或表示式。

但不能是陣列名或指標等型別。

傳址呼叫的特點:1,形參與實參佔用同樣的儲存單元; 2「雙向」傳遞; 3實參和形參必須是地址常量、變數或表示式。方式:函式呼叫時,將資料的儲存地址作為引數傳遞給形參

c語言中指標做函式引數傳遞二維陣列

include void fun int p1 3 int p2 3 int main int p1 3 3 int p2 3 3 int i 0,j 0 fun p1,p2 for i 0 i 3 i for j 0 j 3 j printf d p2 i j printf n return 0 ...

c語言中,帶引數的主函式,如何傳遞引數給它

不可能按值傳遞的,設想一下 type arr sizeof arr 為100萬了位元組,如果按照值傳遞,就要建立一個臨時變數temp也為100萬個位元組,效率豈不是太低了。再可能arr是堆記憶體,引數傳遞是要屬性相同,值相同,難道系統自行去new一段記憶體,這該使用者去釋放 還是系統自動 呢?在命令...

C語言中形參與實參怎麼傳遞,c語言中形參和實參的區別?

我簡單描述一下 c語言傳遞引數機構是這樣的 非指標類的資料傳遞引數時傳數值,指標類資料傳遞引數時傳地址 這裡陣列名也算指標 比如int max int a,int b 這時候如果呼叫這個函式max x1,x2 僅僅將x1和x2的數值傳遞給函式max,a與x1佔有不同的記憶體區域 int max in...