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

時間 2021-08-30 10:37:16

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語言陣列如何在函式中傳遞?不要指標傳遞

陣列只能通過指標傳遞,不能通過值傳遞。陣列引數屬於指標引數,指標引數即時傳址引數 或叫引用引數 如果想在函式中修改引數的值,這是唯一的途徑.如果把陣列當作引數,不管願意與否,它就是指標,指向第乙個值的指標.1.陣列引數就是指向第乙個元素的指標 include void getarr int p,in...

請問在C語言中,函式傳參時怎樣利用指標傳遞陣列

大野瘦子 陣列名就是指標,例如 include void pr char p printf p void main void char s abc pr s 樹桖珍 比如函式需要一個整型陣列 void ex int a 或者可以寫成 void ex int a 效果是一樣的。使用的時候 引用陣列中的...

在C語言中,函式實參與形參之間的資料傳遞方式是傳遞方式

八零後電影院 函式實參與形參之間的資料傳遞方式是 值傳遞 傳遞方式,在c語言中,資料傳遞方式有值傳遞和引用傳遞,值傳遞 傳值,實際是把實參的值賦值給行參,相當於copy。傳值呼叫中,只使用了實參的值。傳值呼叫機制裡,形參是乙個區域性變數,其初始值為相應實參的值。在引用呼叫機制裡,將實參的位址傳遞給形...