C 值傳遞 位址傳遞 引用傳遞

2021-09-30 05:55:02 字數 1286 閱讀 2371

昨天遇到乙個問題:

程式一:

char str[256] ="";

char *sp = str;

visitdepart(&rs,rs.column,sp);

static void visitdepart(result_t * rs, int num, char * spx)}}

note:這個程式表面上看是沒有錯誤的,但是,我用它做了樹的深度遍歷,這就出現了問題,如下圖

當有這樣一顆樹時,可以顯示遍歷結果為0-1-2-5,如果沒有紅圈的子樹,可以遍歷0-1-3.

程式二:

char str[256] ="";

char *sp = str;

int len;

visitdepart(&rs,rs.column,sp,&len);

static void visitdepart(result_t * rs, int num, char * spx,int *plen)}}

note:這個程式可以正常遍歷

分析原因:

sp指向的是str字串的首位址,即sp變數儲存的是str第乙個字元的位址,通過visitdepart傳遞給了形參spx,spx也儲存著str的首位址,通過傳遞遍歷1和3,但當遍歷3時,他沒有子節點了,這時開始返回,但是遞迴時sp是位址的

而程式二相當於len是乙個全域性變數,plen是乙個位址傳遞,而改變的是len本身的值,所以sp始終指向str的開頭,通過len來確定新增字串的總長度。

下面舉例說明一下傳遞

值傳遞:

void exchg1(int x, int y)   //定義中的x,y變數被稱為exchg1函式的形式引數

void main()

程式輸出的結果是:

x=6 , y=4  

a=4 , b=6 

exchg2(int *px, int *py)

main()

它的輸出結果是:

*px=6,*py=4

a=6,b=4

引用傳遞:

exchg3(int &x, int &y) //注意定義處的形式引數的格式與值傳遞不同

main()

輸出結果:

x=6, y=4

a=6, b=4   //這個輸出結果與值傳遞不同。

c 值傳遞 位址傳遞 引用傳遞

一.函式引數傳遞方式之一 值傳遞 1 值傳遞的乙個錯誤認識 先看題一中exchg1函式的定義 void exchg1 int x,int y 定義中的x,y變數被稱為exchg1函式的形式引數 問 你認為這個函式是在做什麼呀?答 好像是對引數x,y的值對調吧?請往下看,我想利用這個函式來完成對a,b...

值傳遞 位址傳遞 引用傳遞

值傳遞使得實參與形參沒有聯絡,函式與函式之間沒有耦合性,在各自的函式裡修改值不會改變各自本身的值。但這也是它的缺陷。1.實參傳入被調函式無法交換數值。2.當傳入值大於8位元組即需要進行整體拷貝,無論是開闢的空間還是資料的拷貝都相對較大 這也是設計陣列退化為指標的原因 而指標傳遞只有4個位元組 所以需...

值傳遞 引用傳遞與位址傳遞對比

引用傳遞 形參與實參公用乙個記憶體單元,同時變化。值傳遞 形參是實參的轉殖體,形參在記憶體單元中發生變化不會影響到實參。形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的。記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。實參可以是常量 ...