2013-12-17 35 views
-1

我是Objective-C的初學者,我很難理解指針和變量之間的區別。例如,指針VS變量,Objective-C

int number = 30;

int * pointerNumber = 30;

如果有人能向我解釋這一點,我將非常感激。

+4

與C相同。 – johnMa

+2

這是一個非常廣泛的問題,在互聯網和書籍上有很多很好的答案。你能更具體一點嗎?你懂什麼,你不明白什麼? – Sebastian

+0

有時候,通過詢問一個可以直接提問的人而不是諮詢文本來學習會更容易。 – Zarathuztra

回答

1

指針是一個簡單的柄,位置或存儲器地址。所以你用一個指針,你不是直接操縱一個事物,而是操縱指針指向的內存中的某些東西。

但是,對於像int這樣的標量值,您直接使用該數據。一個給定的語言如何使用指針和值取決於語言,因此它們在何處存儲以及訪問方式等都有影響。

這不是整個故事,但它是解釋它的最簡單方法恕我直言。

現在,在Objective-C的上下文中,您不會真正找到許多指向int類型的指針,您會發現一個int值。另一方面,對象使用類似瘋狂的指針,它允許你將一個對象傳遞給一個方法,或者通過消息發送,修改它,並且仍然有相同的對象,只是發生了變異。

但是,使用該int,將它作爲消息參數傳遞肯定會傳遞int值,但不會傳遞給它,所以原始int將保持不變。

這裏是pointers

一些文檔,然後在這裏是在Objective-C爲例指出來

假設了一下,我們有一個簡單的iOS或OSX應用下列蘋果的Objective-C標準和圖書館。讓我們假設我們有一個類,富,用適當定義的頭

#import Foo.h 
#import Bar.h 
@implementation Foo 
    - (void) doSomethingWithPointer:(Bar)obj{ 
     obj.x = 5; 
    } 

    - (void) doSomethingWithValue:(int)num{ 
     int x = num; 
    } 

    - (void) doThings:{ 
    //Suppose I have an object of type Bar available to me. I'm going to get a pointer to a new instance of that object, freshly allocated into memory 
    Bar *barObj = [Bar alloc]; 
    //we will assume Bar has only one feature, a publicly accessible property called x. It's of the int type, of value 1, but again, is part of the Bar object that we are POINTING to. 

    //Now, here is a variable that is NOT a POINTER, it's merely a value in memory. 
    int num = 1; 

    //Let's call the two methods in this class that perform some action and see what happens. 

    //first, our pointer 
    NSLog(@"%d",barObj.x);//outputs 1 
    [self doSomethingWithPointer:barObj]; 
    NSLog(@"%d",barObj.x);//outputs 5 

    //Now, let's call on our variable that is just a value and NOT a POINTER 
    NSLog(@"%d",num);//outputs 1 
    [self doSomethingWithValue:num]; 
    NSLog(@"%d",num);//outputs 1 

} 
@end 

我在這裏展示的不只是一個指針的概念,而且還通過引用傳遞的。除此之外,我還展示了一個指針和一個變量表示的標量值之間的區別。當我們將「變量」傳遞給某個方法時,它會在方法中進行修改,但是您可以看到原始內容保持完整,並且在方法中使用的內容沒有改變。只有值被傳遞,而不是對原始值的引用。

但是,在對象的情況下,我們傳遞了一個指向對象的指針。由於我們修改了由該點表示的對象,在內存中的THAT位置,對象DID內部的值發生了變化,因爲我們本質上是在同一個對象上進行操作。我們知道去哪裏尋找記憶。

如果這仍然不是決策意識只是讓我知道在評論中,我們會想出這個東西了:)

我會假設你來,無論是從腳本或Java的背景,如果你不不知道指針是什麼;)

作爲一個方面說明,爲什麼只有obj-c中的對象纔會出現這種情況?對象或類的實例封裝數據,並且數據需要能夠保持完整並傳遞,但是如果突變,則該對象的狀態無論在哪個對象的實例中都需要反映出來用來。

+0

非常感謝您的詳細回覆!我現在清楚地知道指針和原始值之間的區別。另外,我來自Visual Basic。 – Deemeehaa

+0

我很高興它幫助!我看到,另一個非指示性語言;) 從技術上講,我應該澄清,我知道在Java中我們稱它們爲原語,通用術語是標量值:http://en.wikipedia.org/wiki/Variable_%28computing%29 – Zarathuztra

-1

變量包含的值,而指針包含存儲器地址,其中變量/值是