好的答案已經在這裏,所以我借用一些好句子,並試圖爲您提供一個更簡單的簡單答案。
請記住,一個指針是計算機存儲器的地址,當它涉及有星號標誌,這可能意味着做兩件不同的事情:1_definition,2_dereferencing。
這裏值得注意的是你可以在你定義指針的同一行上初始化,或單獨的行。所以這兩個是等價物:
int x=8;
int *ptr=&x; //this is equivalent for
//this:
int *ptr;
ptr=&x;
幾乎相同兩個任務用&符號(defenition和引用)來完成。您可以:
1_define引用,然而,這裏的一個微妙的特殊規則要注意,你不能在一行中定義的引用而在另一個引用它們。換句話說,只要你定義了必須初始化參考與另一個變量。從那一刻起,它變成了別名!例如如果它被引用到一個int,它的行爲就像是int!(就像你的情況一樣),唯一的區別是它也會有該int的地址,在某個場景的後面。
(即使一旦你做出一個對象的引用,它不能被改變後指任何其他對象。)
2_The另一件事是&符號的作用是(如莫尼魯爾·伊斯拉姆米隆的另一種回答說)提取的地址的一個變量。
現在,這些基本的東西后,你就可以看看這個(更好,如果你運行它太):
int main()
{
int j=25;
int* ptr;
ptr = &j;
int& ref1 = j, ref2 = *ptr;
//-------int& ref3 = ptr; // <-------- error!
//-------You can not assign an address to an int!
//-------Remember that in the valid examples above, ref1 and ref2 are really nothing but j
cout << "j is: " << j << endl;
cout << "ref1 is: "<< ref1 << '\t' << "ref2 is: " << ref2 << endl;
cout << "They are both aliases for j";
在傳遞按引用的功能,同樣的事情發生,對象它們本身被髮送到那些以別名(備用名稱)保存的函數作爲參數。 另請注意,在引用返回函數中,您不返回地址,而是通過其別名(通過引用它)返回對象本身 - 無論它是什麼。所以:
class_name& foo2(){
static class_name x=something;
return x;
} //OK
//but:
//-------int *ptr2 = foo2(); // <-------error!
在最後一行
再次,你要指定一個類(egint,浮子,用戶定義的,等等)的指針,這顯然是無效的(基於C++最基本的規則)。
我已經使用這些鏈接來寫這個答案你:link,link,link, link。
我希望它有幫助。
因爲您不能將指向'int'的指針指向指向'int'的指針。更改爲'int * p =&(f.geta());' – 101010
它是「做同樣的事情」,但它不是類型安全的,或者至少不允許由C++的轉換規則隱式地發生。我們認爲價值在概念上與指向這些價值觀的指標不同,如果你想獲取必須寫'&'的地址。如果它不以這種方式工作,那麼具有多級指針的某些操作可以用非常神祕的方式編寫。 –
@101010 ok..but然後我們如何分配* p =&z?是不是分配一個整型指針的int引用? – Omkar