2013-07-07 76 views
3

在過去,我主要使用.NET進行編程,因此我不必擔心指針等事情特別多,但最近我已經進入Objective-C並決定了嘗試和充分理解內存管理的工作。指定指針 - Objective-C

所以,首先我想說我知道你不應該爲int的指針,因爲它不會提高效率,但這主要是一個出於好奇的實驗。

如果我創建一個整數指針,如: int * intPointer; 如何來,它實際上是指針指向一個被分配當我這樣做的存儲位置:

intPointer = 43; 

正如我的理解是,不應該這樣的行動會改變指針的實際內存地址?

這同樣適用於這一段代碼:

int *intPointer; 
int integer; 

integer = 43; 
intPointer = integer; 

同樣的結果,但是當我與CLLocationCoordinate2D工作,試圖讓一個指針指向一個CLLocationCoordinate2D變量,其實我不得不這樣做:

CLLocationCoordinate2D *coordinatePointer = &coordinate; 

對我而言,這似乎是正確的方法。

這是我在stackoverflow上的第一篇文章,我希望能夠得到回答。 謝謝!

+0

我建議您通過Bill Dudney在iBooks商店購買您需要了解的所有C語言電子書。這將爲您提供Objective-C的良好C介紹。 – uchuugaka

+0

壞代碼的氣味味道不好。您幾乎從不在objective-c中使用&運算符。 – bbum

+1

@bbum - 幾乎從不? 'NSError **'...... – CRD

回答

1
intPointer = integer; 

這隻適用於隱式轉換。指針只是一個內存偏移量,它是數字的,所以它可以從一個int中分配(並且你應該得到編譯器的警告)。

在CLLocationCoordinate2D的情況下,struct不能轉換爲指針,所以編譯器報告錯誤。當你寫&coordinate時,它給出了可以指定哪個指針的變量coordinate的引用。

+0

因此,隱式轉換將'intPointer = integer'轉換爲類似'intPointer =&integer'的東西或者是那個代碼實際上改變了指針的內存偏移量?我檢查了'intPointer'指向的值,當我使用'intPointer = integer'時,它確實分配了它。 –

+0

'intPointer =&整數'和'intPointer =整數'正在改變intPointer指向的偏移量。唯一的區別就是intPointer最終會有的價值。在第一種情況下('&integer')它會指向'integer'變量,所以'* intPointer = 42'將把42寫入'integer'變量。在第二種情況下,它將指向內存地址43(變量'integer'的值),所以編寫'* intPointer = 42'很可能會引起訪問異常異常,因爲您無法寫入任何隨機地址。 –

+1

@FabianLindfors - 上面的答案給人的印象是,將整數賦值給指針是可以的。不是。你應該永遠不要這樣做(至少在你真的瞭解正在發生的事情並意識到爲什麼這是一個可怕的想法之前)。 –

1

你最初的假設是工作,是假的:

intPointer = integer;

實際發生的事情是,如果您將10存儲在變量「integer」中,則它將被複制到intPointer中。所以當你試圖用intPointer從intPointer中獲得值時,它會給你存儲在內存10的值,這可能是任何東西。但是,如果你這樣做:

intPointer =&整數;

只有這樣整的記憶將獲取存儲在intPointer.Then以後,如果你這樣做:

整數= 60;

那麼* intPointer也會給你60個。 換句話說,intPointer的內存地址是整數,因此會指向整數。

+0

謝謝你這麼快速和一致的答案,編程可能真的很痛苦,特別是當你這麼做了很長時間但仍然不知道這樣的基本東西。 –

0

你問的問題是關於純C指針的問題。 Objective-C是C語言的補充(還有Objective-C++,它是C++的補充)。當您使用Xcode編寫代碼時,您可以決定編譯器給您的警告以及這些警告是否應該視爲錯誤。用最低的警告設置,編譯器將接受絕對不應該接受的代碼。在您的例子

int *intPointer; 
int integer; 

integer = 43; 
intPointer = integer; 

第二次分配將不與編譯器,任何理智的構建設置編譯(但有可能設置構建設置,使其編譯。檢查你有什麼警告)。這樣做的正確方法是

intPointer = &integer; 

intPointer =整數,如果你說服的編譯器來編譯它,將採取43號把它解釋爲一個指針。由於很有可能在內存位置43存儲了任何明智的內容,因此使用intPointer讀取或寫入int很可能會崩潰。 intPointer = & integer取變量「integer」的地址並將其存儲在指針intPointer中。現在,「intPointer」的值是整數的地址,而* intPointer的值是「整數」的內容,爲43.

瞭解Objective-C對象是下一步。