c 函式的傳參

2022-07-19 12:30:13 字數 1864 閱讀 6206

在闡述c++中函式傳參之前,先說明一下為何寫這篇部落格。事實上,c++的傳參方式的討論已經很多,但是在解劍指 offer 27. 二叉樹的映象(leetcode 226翻轉二叉樹)時發現三種傳參方式自己並沒有完全弄清,在以樹指標為物件時,就出現錯誤。

網上有三種常見的交換變數的方式,第一種建立臨時變數儲存其中乙個待交換的值,這種方法最為常見。

auto tmp = a;

a = b;

b = tmp;

第二種不建立臨時變數,利用四則運算,**如下,但是可能會產生數值溢位,不建議使用。

a = a + b;

b = a - b;

a = a - b;

第三種同樣不建立臨時變數,利用位運算,**如下。這是因為 x ^ y ^ y = x,任意變數與其他變數異或兩次結果等於自身。然而,該方法只適用於交換整型或者字元型資料交換,這是因為位運算的運算分量只能是這兩者。

a = a ^ b;

b = a ^ b;

a = a ^ b;

所以,最簡單的才是最有用的,第一種方法雖然樸素,但是有效。

在翻轉二叉樹時,其實問題本身解答非常容易,leetcode也是定級為簡單。就是個普通的前序遍歷或者後序遍歷,前者自頂向下,後者自底向上。但是在交換兩個treenode*變數時,自己寫的交換函式竟不能通過。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

};

自己的交換**如下:

void swapnode(treenode* left, treenode* right)
在inverttree函式中使用該函式,交換兩個二叉樹指標不能成功交換,而用c++自帶的swap函式確又可以。

函式傳參有三種:值傳遞,引用傳參和指標傳參。三者的主要區別為:值傳参隻傳遞實參的拷貝值,函式中的操作不影響實參,引用傳參和指標傳參均會影響實參,函式執行完畢相當於實參完成了函式內部的操作。引用傳參和指標傳參的不用在於,引用傳參必須要先初始化實參,而指標傳參不必。以交換變數為例,三中傳參分別為:

//值傳參

void swap(int a,int b)

//引用傳參

void swap(int &a,int &b)

//指標傳參

void swap(int *a,int *b)

第一種不能完成實參的交換,後兩種可以。這樣分析下來,自己寫的swapnode(treenode* left, treenode* right)函式看似也是指標傳參呀,但是為何不行呢。這裡就出現了偏差,treenode* 雖然是指標,但是被交換的兩個變數也都是指標,相當於進行了值傳參。如果想要真正讓交換函式起到作用,應該進行引用傳參或者指標傳參。

引用傳參交換兩個treenode*指標變數表示為:

void swapnode(treenode*& left, treenode*& right)
如果有treenode* a和treenode* b,直接呼叫swapnode(a, b)即可。

指標傳參交換兩個treenode*指標變數表示為:

void swapnode(treenode** left, treenode** right)
如果有treenode* a和treenode* b,直接呼叫swapnode(&a, &b)即可。

者兩種傳參方式傳遞樹指標時,可能同時出現了**或者同時出現了*&略顯怪異,但是事實確實如此。

c 函式傳參 和 c 函式傳參的區別

先看c 的 public static void getfilename streamwriter sw,string path,int indent,listlistfile listlistfile new list filehandle.getfilename sw,facepic,2,lis...

c語言函式傳參

引入 不過對於函式的引數呼叫時常會出現問題。include int p int a int main void 這裡的自定義函式p,接收乙個int型別的引數,並定義為a。雖然自定義函式和主函式的變數名,都為a,但是這裡的a是兩個變數。雖然函式也將a返回了,但是主函式並沒有接收,忽略了p的返回值。所以...

python 函式傳參 傳參和傳引用

首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...