C 中將指標函式引數修改為引用作為引數有什麼好處

2021-04-19 08:29:19 字數 4268 閱讀 2587

1樓:匿名使用者

一般來說,這樣做抄是為襲了防止在函式中亂用引數 因為如裡你用int &a,這樣在函式中就只能用a,也知道a是個整型變數 而如果你用int *a,那麼在函式中只知道a是個整型指標,至於它指的是個數還是一個向量, 這個不清楚,如果不小心用了a[1]這些的話,明顯就越界了 因此,在寫程式中,如果可能的話,推薦在函式裡用引用代替指標

引用作為函式的引數有什麼優缺點

2樓:另耒

使用引用傳參的話,在函式中對該變數所做的修改,在函式返回後依然存在。這未必是程式設計師所希望的。

特點: 傳入實參本身,不建立副本

好處: 傳實參本身的好處

如void swap(int &a, int &b)確實可以交換兩個變數

如果是void swap(int a, int b)傳進去的是引數的拷貝,實參並沒修改

2.不建立拷貝。可以很好的提升效率

如果引數是一個結構體或者類,很大,進行引數拷貝比較耗時,如果傳引用就避免了這個過程

為了避免有時候不需要修改引用引數時對該引數誤操作,可以加const做保護

3樓:匿名使用者

1、在函式呼叫過程中使用指標引數來傳遞數值,相比直接傳遞數值本身,能夠帶來時間和空間上節約。但是,使用指標有一些不便利的:第一,在函式中必須使用指標操作符「->」來操作指標引數;第二,呼叫函式時,必須通過地址操作符「&」來傳遞數值的地址。

在c++中,引用能夠避免上述煩瑣的操作。當使用引用方式傳遞引數時,實參的地址能夠自動傳遞到呼叫的函式當中,並且在函式當中使用引用引數時,地址又自動解引用為引數數值本身,函式中不需要使用指標操作符「->」。這些操作都由編譯器自動完成,對程式設計師是透明的。

2、如果「函式引數有一個const float & a」,那麼呼叫該函式時,引數值將自動轉換為float型別,並型別float的臨時變數地址傳遞到函式當中。因此,如果傳遞int、long以及char型別的變數時,程式能工作正常。如果傳遞double型別的變數,一旦該變數的數值超出float型別的數值範圍,程式將工作失敗。

另外,站長團上有產品**,便宜***

4樓:匿名使用者

特點: 傳入實參本身,不建立副本

好處: 傳實參本身的好處

如void swap(int &a, int &b)確實可以交換兩個變數

如果是void swap(int a, int b)傳進去的是引數的拷貝,實參並沒修改

2.不建立拷貝。可以很好的提升效率

如果引數是一個結構體或者類,很大,進行引數拷貝比較耗時,如果傳引用就避免了這個過程

為了避免有時候不需要修改引用引數時對該引數誤操作,可以加const做保護

c++中使用指標、引用進行引數傳遞

5樓:匿名使用者

傳遞變數值抄交換是將變數ab的值傳襲給另外兩個變數cd(例bai子中還是ab,但它是

duswap函式新申請的變數zhi,與主函式的不是同dao一個),交換的只是cd的值,所以原ab的值不變,而傳遞指標則是將主函式ab的指標(即ab的地址)傳給swap,所以swap交換的是這兩個地址中的資料,這兩個地址就是指向原ab的所以可以交換。

比如說有四個房子1234地址是(abcd),第一種是把12房子的東西搬到34中,再交換34中的東西,後面兩種直接是把地址為a和b的兩個房子裡的東西交換。

6樓:匿名使用者

傳普通數值抄到函式中,函式對形參進行改變不會影響到主函式中的資料

傳指標方式,並且通過指標變數對指標所指的地址中的內容進行改變時,會同時改變主函式中的實參所對應的資料, ( 但如果改的只是指標變數本身的值,則沒有影響!! )

引用方式相當於給實參取了個別名,操作哪個變數都相當於操作實參,所以,一變都變。

7樓:天馬行空

c++中函式傳值有兩種方式,一種是傳值,還有就是傳遞引用(指標)。內傳值實際上是把實參的容值拷貝過去,所以對原來的值沒有影響。

而傳遞指標雖然也是拷貝過去(拷貝的是指標值,不是拷貝指標指向的數,你會發現傳遞指標的話形參實際上是實參的地址,和直接傳值方式形參是不一樣的),但是你賦值後會把指標指向的值給替換。你會發現你僅僅想改變指標本身的值還是做不到的,但是這樣你可以改變指標指向的值了,而改變不了指標本身其實就和第一個例子一樣的道理,因為傳遞的是拷貝過去的指標值,如果你想改變指標本身的話,就要傳遞二級指標。

所以在c++裡邊提倡用引用代替指標作為形參,用引用**簡潔易懂,不容易出錯。引用可以理解為實參的別名,你改變它就會改變實參的值。可以把引用理解為const指標。

8樓:匿名使用者

第一張圖,你只是來傳源入一個引數,只是一bai個值,就是在main函式裡定義的du,在swap函式裡面是zhi有進行參值的dao改變,而函式結束後,參形並不能改變實參,所以值沒有變。你第二和第三張,傳入的是兩個實參的地址,把地址裡的內容進行交換,就是兩個值,而改變後的值在放入地址裡面,所以有改變值。簡單點講就是第一張只是值的改變,但地址的內容沒變,第二第三直接是地址裡的內容進行改變。

9樓:網三傻

形參值的改來變不會引起實參

改變源,引用和指標可以改變實參的值。這麼說能懂嗎?也就是第一個中,改變的僅僅是swap函式裡的a和b,並沒有改變主函式下的a和b。

第二個和第三個,使用了指標和引用,都改變了原來主函式的a和b。

10樓:匿名使用者

第一個傳參到swap中是新的變數,swap交換的是新的變數,不是引數,下面兩個通過指標或者引用是同一個變數,改變的是原來引數

c++函式引數為物件和為物件的引用型別時,作用一樣嗎

11樓:王天旻

不一樣,一個是複製傳遞,一個是引用傳遞。

複製傳遞時將物件複製一遍,在函式中的物件和原物件值相同,但是地址不同,函式中若修改物件的值,原物件不會受到影響,當函式執行完時,複製的物件會被銷燬。

而引用傳遞不會複製,只是將原物件的地址傳過去,類似指標。此時函式中的物件和原物件是一個東西,相同的地址,可能名字不一樣而已。

一般傳遞物件時使用的是引用傳遞,效率更高。物件一般比較大,複製的話銷燬的時間較多。如要防止函式修改引數,可以使用const 引用。

附個演示**,你就知道了。

#include

#include

using namespace std;

class a

void show()

private:

int data;

12樓:凌漢晨

傳值相當於在函式內重新定義一個物件,把引數引用

的物件賦值給這個新定義的物件。在函式內對物件的操作都是針對新定義的物件,函式退出後,新定義物件就不存在了。傳址呼叫則沒有定義新物件,函式內的操作就是對引用物件本身的操作。

13樓:有你好幸福啊

函式引數有直接變數(如int、char、double等)型別、指標型別和引用型別。

如果引數是變數,傳遞方式是傳值,就是將實參的值複製(複製,意味著空間消耗和時間消耗)到「棧」空間中。

如果引數是指標,傳遞方式是傳址,需將指標複製(同樣也消耗空間和時間,對於陣列而言,只需儲存陣列首地址)到「棧」空間中。

如果是引用,則既不是傳值,也不是傳址,主調函式和被調函式共享引數的存放地址,與全域性變數共享方式相同。

對於拷貝(複製)建構函式而言,類物件通常需要較多的儲存空間,如果按值傳遞,必然會較大消耗「棧」空間,也需要較多的時間實施複製過程。因為複製建構函式不會修改引數的內容,也不會修改引數的屬性,所以建構函式的引數應該是常量引用傳遞,如

14樓:粒粒載畝

作用當然是不一樣的,前者是對源物件的賦值。

後者是對源物件的地址的賦值。

後者以指標的操作會影響到原來的物件,而前者不會。

15樓:魔尊

當然會不同啊,p的值只在改函式裡面會有所變化,函式呼叫一結束,p又回到之前的值,沒有任何的改變,出淤泥而不染;而q就不同了,被感染了,它的值會儲存起來,函式呼叫結束了,它就不再是剛開始呼叫的那個值了,而是呼叫之後的新值。

16樓:秋天來了仔陳

這麼講吧

void fun(int x,int y)與void fun(int &x,int &y)不同,上一個沒有交換成功,下一個交換成功了的,引用就是用別名,還是對那個數操作,不知聽懂了嗎。

在c中用陣列指標和什麼作為函式引數能夠

除了引用可以將引數值帶回外其餘的 陣列,指標等 都沒有這種能力 如果原題確實是這麼出的,那隻能說明出題者是c 半吊子.引用,三者的本質都是指標 還有 引用 和全域性變數 地址,三者的本質都是地址 c 中如何把陣列作為引數 對於陣列 名作為參bai數傳遞,有兩種方du式zhi 1.使用陣列名本身,如以...

c語言 指標函式跟函式指標的區別

指標函式是個函式,其返回值是指標 函式指標是一個指標,指向函式的入口地址 典型的指標函式如 void malloc unsigned int size 這個記憶體分配函式就是個返回void 指標型別的函式。若寫成void fun ptr unsigned int size 這時fun ptr表示一個...

c語言指標陣列如何存放函式地址C語言指標陣列如何存放函式地址

c c 的指標的靈活,常把許多初學者搞暈,連高手也是如此。1.當然,可以呀,一切資料都可返回 2.複合指標型別直接表示非常麻煩 連高手都是這樣 可以分解成多個簡單型別 typedef void funtype void funtype num 100 分解後簡單多了!3.因為函式名不是字串,初始化時...