到底什麼時候用指標或是引用

2021-06-03 07:59:56 字數 1856 閱讀 5517

1.問題提出:

當乙個類的物件作為實引數傳遞時,使用值傳遞和引用傳遞有什麼區別?

比如: datetype examplefun(cstring &strfilename,...)與

datetype examplefun(cstring strfilename,...)

解答之前,我們先來看2個基本的概念:形參和實參。

->通俗的講:形參是形式上的引數,實參是實際的引數;

->詳細的講:形參只是對實參的一種抽象型別描述,只是宣告乙個函式(方法)能接受什麼型別的實參,而不確定接受的實參具體內容是多少;

實參就是傳遞給函式(方法)對應形參的具體內容(值),形參的初始指(內容)由實參決定.形參在函式(方法)結束返回後就被釋放了.

2.引數傳遞方式分:傳值和傳址;

1).傳值方式,只是將實參的值的拷貝傳遞給函式(方法),在方法內對形參進行操作,其物件是實參的拷貝,對實參不能造成影響.在方法結束返回後,形參被釋放丟棄,實參的內容並不會改變;

2).傳址方式,將實參的位址傳遞給函式(方法),在方法內對形參進行操作即等於對實參進行相同的操作,在方法結束返回後,形參同樣被釋放,實參的內容將會是對形參進行操作的結果.

而傳址方式,又可以細分為:引用傳遞(pass-by-reference) , 指標傳遞(pass-by-pointer)

引用其實就是物件的別名,傳物件的引用,用於把乙個物件的位址作為引數傳過去,而不是物件本身。

這是我們就明白了前面問題的答案:傳遞引用,避免了一次實參到形參的拷貝,提高了效率。

3.關於何時使用引用引數?

(1)使用引用引數的主要原因有:

程式設計師能夠修改呼叫函式中的資料物件

通過傳遞引用而不是整個資料物件,可以提高執行速度

(2)對於使用傳遞的值而不做修改的函式:

如果資料物件很小,如內建資料物件,則按值傳遞

如果資料物件是陣列,則使用指標,並將指標宣告為指向const的指標

如果資料物件是較大的結構則使用const指標或const引用,以提高效率,節省複製結構所需的時間和空間

如果資料物件是類物件則使用const引用。類設計的語義常常要求使用引用,這是c++新增這項特性的主要原因,因此傳遞類物件的標準方式是按照引用傳遞。

(3)對於修改呼叫函式中資料的函式:

如果資料物件是內建資料型別則使用指標。

如果資料物件是陣列則只能使用指標

如果資料物件是結構則使用引用或指標

如果資料物件是類物件則使用引用

4.總結:

在c/c++程式設計中,到底什麼時候該用指標來傳遞引數呢?總結如下:

1. 需要改變實參的時候, 只能用指標.

2. 傳遞大型結構並且"唯讀"其元素的時候,

因為大型結構通過值傳遞, 需要拷貝其每個元素, 這樣效率太低.

3. 需要遍歷陣列或頻繁引用其元素時, 這樣效率比使用下標高.

4. 動態分配空間時, 必須使用指標.

5. 傳遞陣列時, 必須使用指標.

6. 函式返回指標時, 比如fopen

7. 另外,有時候需要使用二級指標,即指標的指標,例如:

memallocate(char *a)

當呼叫此函式進行記憶體分配時,發現不能分配記憶體不能成功,因為此時對於a來說,形參改變了,但實參並不會改變,他們對應於不同的記憶體單元。正確的寫法應該是:

memallocate(char **a)

這樣就能夠正確地分配記憶體了。

什麼時候用指標形參?什麼時候用引用形參?

0.在作為引數的作用中指標和引用的共同特點是都可以在函式中改變實參物件,標準 c 中是沒有引用形參的,只能使用指標形參。1.就函式引數傳遞數值而言,傳遞指標與傳遞引用唯一的優勢是避免拷貝,同時帶來實參被改變的風險,但是可以通過const來盡量避免。2.就為改變實參這個目的而言,指標對於引用的優勢在於...

什麼時候使用引用 什麼時候使用指標

使用引用引數的主要原因有兩個 程式設計師能修改呼叫函式中的資料物件 通過傳遞引用而不是整個資料 物件,可以提高程式的執行速度一般的原則 對於使用引用的值而不做修改的函式 如果資料物件很小,如內建資料型別或者小型結構,則按照值傳遞 如果資料物件是陣列,則使用指標 唯一的選擇 並且指標宣告為指向cons...

iOS Copy到底什麼時候用?

a 在oc裡面有個值物件的概念,當你新定義乙個屬性是值物件時就應該用copy來修飾。那麼都什麼物件是值物件呢?值物件 指封裝了基本值 屬於c資料型別 且提供與該值相關的服務的物件。值物件以物件形式表示標量型別。foundation框架向您提供了以下類 這些類產生物件,用於字串 二進位制資料 日期與時...