2010-02-16 69 views
1

如果我錯了,有人可以檢查我的理解並糾正我嗎?非常基本的C問題

int p = 5; //create an int holding 5 
int *ptr; //create a pointer that can point to an int 
*ptr = &p; // not sure - does this mean that my pointer now points to memory address five, or that the memory address my pointer points at contains 5? 

對不起,基本問題 - 我有一個assignmnet很快,需要使用指針,我真的想破解基礎設置之前。

+0

你可能想讀這篇文章:http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-c​​an-be-done-to-overcome –

+0

http://c-faq.com/ptrs/mimic。html –

+0

順便說一句,開始使用的積分 int * ptr 而不是 int * ptr :) – kyoryu

回答

5

幾乎沒有 - 它更改爲:

int p = 5; // create an int holding 5 
int *ptr; // create a pointer that can point to an int 
ptr = &p; // ptr now points at p 
+1

然後(這是指針的指針),你可以執行'* ptr = 6;'。 '* ptr'的意思是「ptr指向的東西」,所以這將'p'的值改爲6,就像你已經完成了'p = 6'一樣。 –

0

你想

ptr = &p; // set ptr to point to the location holding p 
1

ptr現在指向具有存儲在它5的內存地址。

此外,我不相信代碼編譯。您可能想要:

int p = 5; //create an int holding 5 
int *ptr; //create a pointer that can point to an int 
ptr = &p; // not sure - does this mean that my pointer now points to memory address five, or that the memory address my pointer points at contains 5? 
3

您的程序錯誤。 ptr未初始化。分配給*ptr最有可能會造成內存違例。您不能將int*(即&p)分配給int(即*ptr)。

正確的是:

ptr = &p; 
0

其他已經解釋如何解決你的代碼。爲了理解,讓我告訴你,你錯了做什麼:

*ptr = &p; 

*ptr解引用指針,即*ptr = ...分配的東西插入內存插槽,其ptr指向。由於ptr尚未初始化,因此它指向內存中的某個未知位置,並且*ptr = ...可能會因Segmentation Fault或類似情況而失敗。

由於ptr是指向int,的*ptr = ...右手側期望的int爲好,但傳遞給它的一個int(&p)的地址,這導致一個編譯器警告。

1

指針基本上是一個地址。將指針看作地址標籤,並將其作爲實際房屋的價值。您可以使用標籤找到的房子,但標籤不是的房子。

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; 

這沒有意義。我們已經開始了兩種不同的事情,並將其轉換爲另一種!現在我們試圖給房子分配一個標籤,而在我們將房子分配給地址標籤之前。

0

我知道這並不直接回答您的直接問題(其他人已經完成),但我會建議您從c-faq中讀取section on pointers

很多很好的信息。

0

int a = 5;

聲明您存儲的指針類型

int * ptr;

將變量的地址分配給指針

ptr =&a;