2013-02-20 129 views
7

我意識到99%的人認爲「什麼是*** ......」但請幫助我理解使用pointers這個概念。我相信我的具體問題會幫助很多新手。在ObjectiveC中使用指針的最大優勢是什麼

我知道指針是什麼,它們是對內存中地址的引用,並且通過使用(*)運算符可以獲取該地址中的值。

比方說:

int counter = 10; 
int *somePointer = &counter; 

現在我已經在counter內存中的地址,我可以做這個間接指向它的價值:

int x = *somePointer; 

這使得x = 10,對不對?

但是這是最基本的例子,對於這種情況我可以使用int x = counter;並獲得該值,所以請解釋爲什麼指針在Objective-C和其他一些語言中真的是如此重要......在什麼情況下只有一個指針纔有意義?

欣賞它。

+3

指針不是對地址的引用。您可能會說指針是對內存的引用,或者它是對變量的引用,但它*是*地址。 (從技術上講,指針是一個變量,其值是一個地址,英文不明確。) – 2013-02-20 23:07:46

+4

一個不會簡單地靜態分配對象。 – CodaFi 2013-02-20 23:11:35

+0

你可能想從那裏開始:http://stackoverflow.com/questions/5203284/objective-c-and-pointers/5203296#5203296 – 2013-02-20 23:13:22

回答

2

什麼是使用指針中的ObjectiveC

我想說的最大好處是,你可以使用的ObjectiveC在所有的最大的優勢 - 所有的ObjectiveC對象是指針是訪問使用指針(編譯器和運行庫不會讓你靜態創建對象),所以你不會得到任何進一步沒有它們... ...

+0

感謝allot @ H2CO3 – NickCave 2013-02-20 23:24:10

5

Objective-C有指針,因爲它是C的進化,它廣泛使用指針。像Objective-C這樣的面嚮對象語言中的指針的優點是,在創建對象之後,可以傳遞指向對象的指針而不是傳遞對象本身。換句話說,如果你有一些佔用大量存儲空間的對象,傳遞一個指針會比傳遞一個對象本身更復雜的內存效率。在簡單的情況下,這可能並不明顯,當你只處理像ints這樣的基本類型時,但是當你開始處理更復雜的對象時,節省的內存和時間是巨大的。

更重要的是,指針使它更容易讓您的代碼的不同部分彼此交談。如果變量只能通過「按值」而不是「通過引用」(這是使用指針時發生的情況)傳遞給函數,那麼函數永遠不會改變它們的輸入。他們只能通過返回一個值或改變一個全局變量來改變程序的狀態 - 過度使用通常會導致馬虎,無組織的代碼。

下面是一個具體的例子。假設你有一個Objective-C的方法,將JSON字符串解析,並返回一個NSDictionary

+ (NSDictionary *)parseJsonString:(NSString *)json 
          error:(NSError **)error; 

的方法會做解析,如果一切順利還好返回NSDictionary。但是如果輸入字符串有問題怎麼辦?我們想要一種方式向用戶(或者至少給程序員)指出發生了什麼,所以我們有一個指向NSError的指針,它將包含這些信息。如果我們的方法失敗(可能返回nil),我們可以取消引用error參數來查看出了什麼問題。我們實際做的是給我們的方法兩種不同的返回值:通常,它會返回一個NSDictionary,但它也可以返回一個NSError

如果你想了解更多關於這方面的信息,你可能有更好的運氣搜索「C中的指針」而不是「Objective-C中的指針」;指針當然在Objective-C中被廣泛使用,但所有的基本機制都與C本身相同。

+2

底層機制不僅與C本身完全相同, * is * C – CodaFi 2013-02-20 23:14:28

+0

@CodaFi你一直都很棒,今天晚上一如既往:D – 2013-02-20 23:14:56

+0

@CodaFi是的,說得好。 – bdesham 2013-02-20 23:17:16

1

項目:

如果我告訴你我寫一個程序,將維護一組櫃檯,但櫃檯的數量將用戶的時候就開始計劃進入。我們用堆中分配的整數數組對它進行編碼。

int *counters = malloc(numOfCounters * sizeof(int)); 

Malloc直接使用內存,所以它本質上返回一個指針。所有的Objective-C對象都被堆分配爲malloc,所以這些都是指針。

項目:

如果我告訴你我寫讀文件,然後跑到另一個函數,當它被完成的功能。然而,這個其他功能是未知的,並且會被其他人,我甚至不知道的人添加。

爲此我們有「回調」。你會寫一個看起來像這樣的函數:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *)); 

最後一個參數是指向函數的指針。當有人叫你寫的功能,他們做這樣的事情:

void MyDataFunction(char *dataToProcess); 

ReadAndCallBack(myFile, 1024, 0, MyDataFunction); 

項目:

傳遞一個指針作爲函數的參數是從一個函數返回多個值的最常見方式。在OSX的Carbon庫中,幾乎所有庫函數都返回一個錯誤狀態,如果庫函數必須返回對程序員有用的東西,則會出現問題。所以你通過,你想要的功能,以第一手資料還給你的地址...

int size = 0; 
int error = GetFileSize(afilePath,&size); 

如果函數調用返回一個錯誤,它是在error,如果沒有錯誤,error大概會爲零並且size將包含我們需要的內容。

+0

如果我告訴你,這個答案沒有一個舔在ObjC中? (當然,保存堆分配) – CodaFi 2013-02-20 23:32:02

+0

我承認我在Objective-C的頭幾個月裏從來沒有真正理解過指針,爲了真正理解概念,我必須學習純C語言。 – iluvcapra 2013-02-20 23:38:13

-1

Objective-C或任何動態分配語言中指針的最大優點是您的程序可以處理比您在源代碼中創建的名稱更多的項目。

+0

對不起,但這沒有多大意義。指針如何影響變量名稱?你有一些如何混合指針與數組? – vikingosegundo 2014-03-24 02:42:31