簡體   English   中英

通過引用傳遞&和*之間有什么區別?

[英]What is the difference when passing by reference between & and *?

聲明函數時,參數string*string&什么區別? 我知道string s會復制字符串s並通過值傳遞它,但是似乎在許多網站上,它們都引用string* sstring& s兩者都是通過引用傳遞。 我是C ++的新手,這是我唯一無法弄清楚的事情。 提前致謝 :)

體面的解釋在這里:

http://www.cprogramming.com/tutorial/references.html

(提示:它的意義不僅僅在於“看起來不同”)

通過指針string* s傳遞的是地址,因此s不是string類型的,而是地址。 如果取消引用,則使用包括*s在內的某些表達式,則*s為字符串類型。

當通過引用string& s傳遞時, s是字符串類型的,因此不需要取消引用。

很多幾乎正確的答案。 許多對於特定的實現都是正確的,但是依賴於編譯器方面未指定的行為。

除了. vs- ->

  • 指針是一流的對象,引用不是。 您可以采用指針的地址,但不能采用引用的地址(您將獲得引用對象的地址)
  • 引用在生命周期中始終引用同一對象。 非常量指針可以更改。
  • 引用不能為“空對象”。 您可以編寫執行此操作的代碼,但是您依賴未指定的編譯器行為
  • 您可以對指針進行算術運算

通常,語言規范對引用的描述很少,有意使編譯器作者在實現方面有很大的自由度。 規范不能保證它們像const指針一樣操作。

我發現指針參數在兩種方面非常有用:

  1. 調用者必須傳遞一個指針,該指針很可能是自動變量的地址。 這對於閱讀調用代碼的人來說很明顯,傳遞地址的變量很可能會更改。
  2. 指針可以具有NULL值,其作用類似於哨兵。 引用無法做到這一點。 例如,在您自己的字符串&與字符串*的示例中,空字符串可能是該變量的可接受值,因此沒有用做前哨。 但是,指針參數的NULL值告訴您的函數調用者未設置字符串*參數。 接收字符串&的函數無法確定調用方是否尚未設置該值或是否具有默認的初始化值。

主要區別在於該函數的調用方式。 考慮以下示例:

void f(string *s)
{}
int main() {
   string s;
   f(&s);
}

和參考版本:

void f(string &s) { }
int main() {
   string s;
   f(s);
}

所以函數調用看起來不一樣...

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM