指針基本上是一個地址。將指針看作地址標籤,並將其作爲實際房屋的價值。您可以使用標籤找到的房子,但標籤不是的房子。
int *ptr; // declares a pointer to an int
因此,ptr本質上是一個內存地址。 (C規範可能沒有實際指定它是一個地址,但是可以忍受我)。
int i = 5; // create a local int.
在堆棧中聲明一個整數,並將它的值設置爲5.i的地址在堆棧空間的某處。
在繼續之前,我們來看一箇中間步驟。這可能不會編譯,如果是的話,實際上並不會做什麼。
&i;
該表達式的作用是返回變量i的地址。這是我在內存中的位置 - 整數的地址。
而且最後一個......
*ptr;
同樣,這可能不會實際做任何事情,它只是一種表達。但是,它所做的是取消引用指針 - 它指向位於包含在ptr中的地址處的實際int。
好的,讓我們來看看我們可以做的一些事情。
ptr = i;
這並沒有做任何事情,至少我們想做的事情。可能不會編譯,但我沒有檢查出來。它不會做任何事情,因爲它將整數分配給整數的地址。這就像通過郵局發送一個箱子到一個地址標籤 - 你實際上想要它去房子!
i = ptr;
好的,這和最後一個一樣,但是相反。按照我們的比喻,這是試圖把房子變成一個標籤!
*ptr = i;
這裏我們已經對指針進行了解引用,並將它的值賦給它。解引用指針本質上就像使用標籤驅動到房子一樣。一旦我們在那裏,我們可以做的事情到實際的房子。這是有效的,因爲解引用的int指針是一個int,而int也是一個int。
ptr = &i;
這也適用。 &我基本上爲房子'我'做了一個新的標籤。既然我們有雙方的指針,我們可以指定一個到另一個。這基本上是將我的地址標籤複製到名爲ptr的地址標籤。
*ptr = &i;
這沒有意義。我們已經開始了兩種不同的事情,並將其轉換爲另一種!現在我們試圖給房子分配一個標籤,而在我們將房子分配給地址標籤之前。
你可能想讀這篇文章:http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-can-be-done-to-overcome –
http://c-faq.com/ptrs/mimic。html –
順便說一句,開始使用的積分 int * ptr 而不是 int * ptr :) – kyoryu