-
看到有幾條線**,卻不告訴我們是哪條線**,吊著別人的胃口不好。
-
在C中,沒有一般的參考概念,這是C++的概念。
在 C++ 的函式引數中,有兩種形式,其中:
typevar,稱為引用方法;
typevar,稱為傳遞。
兩者之間的區別在於,當傳遞引用時,實際傳遞給函式的表單引數是對實際引數的引用,而不僅僅是傳遞給函式的值。 具體效能如下:
傳遞引用時,引數和引數是相同的變數,即它們使用相同的記憶體空間並具有相同的位址。 傳輸值時,兩者的位址不同;
傳遞引用時,沒有新變數,因此沒有類物件引數的構造和銷毀。 如果是值傳遞呼叫,呼叫時會構造,退出函式時會解構。
由於引用使用的是原始引數的位址,因此引用引數值的修改會在退出函式被埋沒後反映在大鍵函式中,而傳遞值呼叫對引數的修改不會影響大鍵功能。
-
1. 傳遞變數引數。
在傳統 C 語言中,函式的引數在呼叫函式時由值傳遞,這意味著函式引數不具備返回值的能力。
所以在傳統的C語言中,如果你需要乙個函式的引數來具有返回乙個值的能力,它通常是通過指標來實現的。 例如,實現。
用於兩個整數變數值交換的 C 程式如下:void swapint(int *a, int *b) 使用引用機制後,上述程式的 C++ 版本是呼叫函式的 C++ 方法:swapint(x,y); C++ 自動將 x 和 y 的位址作為引數傳遞給 Swapint 函式。
2. 將大型物件傳遞給函式。
當乙個大型物件傳遞給函式時,可以使用引用引數來使引數傳遞更有效,因為引用不會生成物件。
複製,即當引數被傳遞時,不需要複製物件。 下面的示例定義乙個具有有限整數集的類:const maxcard=100; class set 建構函式 friend setoperator *(set,set); 過載運算子符號 *,用於計算集合的交集,使用物件作為值傳遞引數 friendsetoperator*(set&,set&) 過載運算子符號 *,用於計算集合的交集,並使用物件的引用作為值傳遞引數。
首先,考慮集合交集的實現 setoperator *(set set1,set set2)returnres; 由於過載運算子不能單獨對指標進行操作,因此我們必須將運算宣告為集合型別而不是集合 *
每次使用 * 進行交集運算時,整個集合都是重複的,效率非常低。 我們可以通過引用來避免這種情況。 setoperator *(set& set1,set& set2)returnres;}
-
在C++中,所謂的指標就是引數,或者變數就是引數,傳達的是內容; 換句話說,它是單向傳輸,傳遞的是乙個數值; 我們可以理解,參考是真實的位址; 這裡你的第一行是函式中引數的傳遞,但使用的引數只是指標,傳遞實際上是值; 最後一行是引用,是位址傳遞的真正意義; 下面是乙個簡單的示例來詳細說明:
讓我們從第一行開始。 例如,現在我們傳遞乙個指標變數 b 給 fun(int*x) 引數,(假設變數 b 指向位址 2000),當你在 fun 函式中使用 x 時,使用 x++,根據你上面的解釋,如果“在函式體中改變 x 就是改變引數的指向”,函式返回後, B的內容應該變成2004,但實際上並非如此,B的內容仍然是2000,也就是說指標引數仍然是值的單向傳遞,它不改變相應引數的內容;你可以自己輸出B和A的內容,實際看看是否可以!!
至於改變*x就是改變引數的值,不是很準確; 應該說,改變 *x 就是改變 x 指向的位址中值的內容; 例如,如果引數 b 指向位址 2000,記憶體位址 2000 中的內容是 100,如果在函式 fun 中使用 (*x)++ 來表示 2000 位址 ++ 的內容,即 100 變成 101,因為記憶體中 2000 位址的內容發生了變化,所以在呼叫函式結束後訪問記憶體 2000 時, 裡面的內容已經是101了;
對於第二行:引數用int&x表示引用,即再次重新命名要傳入的引數,別名x,與上面不同的是函式中的x不分配記憶體(上面一行呼叫函式時會給x分配記憶體,呼叫返回函式時會釋放記憶體), 但是傳遞的引數的記憶體位址會給出給對應的函式,也就是說,對 x 的任何操作都是在操作引數,例如輸入引數是 b(int b,這裡傳遞的 b 是 int,當然如果換函式,也可以傳入指標型別 b) 其實, x 和 b 等價於乙個變數,但它們有兩個名稱;當你修改函式以使用指標的引用時,在函式中更改表單引數的指向實際上是更改實際引數的指向;
我想說細節,忍不住囉嗦,希望對你有幫助!!
-
fun(int&x) 其實我是這樣理解這個問題的,什麼是參考,前面有定義,後面有參考!
例如:int a=10; fun(a);這是函式呼叫!
-
第乙個是 int 指標。
第二個是 int 變數。
-
fun(int *x)
上述說法是錯誤的。 在函式主體中更改 x 不會影響引數,x 只是引數的副本,更改 x 不會更改引數的值。
fun(int &x)
上面這句話也是錯誤的。 這個引數是對乙個引數的引用,也就是說,引數和引數是一樣的,它們是同乙個物件,在函式體中改變x就是改變引數。 而真正論點的指向並不存在。
因為這只是乙個整容手術。 &x 不是對 x 位址的引用,而是對 x 是對引數的引用這一事實。 也就是說,這意味著 real 和 form 引數是同乙個物件。
-
fun(int &x) 這是乙個引號。 它從何而來?
在大鍵函式中,a 和 b 是定義的變數;
在調製函式中是 x,y,max(int x, int y) 在 main() 中是宣告的 max 函式,x,y 是形式引數,它只是形式引數,不占用記憶體。 外層max(int x, int y)為引數,即引數的值傳遞給引數,即執行時為c=max(a,b); ,它跳轉到以下函式中的特定函式,此時,max函式中x=a的值,以及y=b的值。 最後,max 返回 z 的值,在本例中是 x,y 的較大值,分配給 c >>>More