在闡述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 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...