2009-02-24 7 views
21

Czy to prawda, że ​​Gwiazdka zawsze oznacza "Hej, to jest wskaźnik!" A wskaźnik zawsze ma adres pamięci?Co oznacza Asterisk * w Objective-C?

(tak, znany z wyjątkiem tego, że A * jest wykorzystywany do pracy matematycznej)

np

NSString* myString; 

lub

SomeClass* thatClass; 

lub

(*somePointerToAStruct).myStructComponent = 5; 

Czuję, że jest mnie więcej trzeba wiedzieć o Asterirsku (*), niż używam go podczas definiowania zmiennej, która jest wskaźnikiem dla klasy.

Ponieważ czasami już mówię w deklaracji parametru, że zmienna Parametr jest wskaźnikiem i nadal muszę użyć gwiazdki przed zmienną, aby uzyskać dostęp do wartości. To się ostatnio stało po tym, jak chciałem przekazać wskaźnik struktury do metody w taki sposób, jak [myObj myMethod: & myStruct], nie mogłem uzyskać dostępu do wartości komponentu z tej struktury, mimo że moja deklaracja metody już mówiła, że ​​istnieje parametr (DemoStruct *) myVar, który rzeczywiście powinien być już znany jako wskaźnik do tego demostruktu, wciąż miałem do powiedzenia: "Człowieku, kompilatorze, posłuchaj! It IIISSS a wskaźnik:" i napisz: (* myVar) .myStructComponentX = 5;

Naprawdę naprawdę nie rozumiem, dlaczego muszę to powiedzieć dwa razy. I tylko w tym przypadku.

Kiedy używam gwiazdki w kontekście NSString * myString, wtedy mogę uzyskać dostęp do myString, ale lubię, bez informowania kompilatora za każdym razem, gdy jest to wskaźnik. np. używając * myString = @ "yep".

Po prostu nie ma dla mnie sensu.

+0

Właściwie jest to pytanie C, ponieważ nie jest specyficzna dla Objective-C :) –

+0

duplikat http://stackoverflow.com/questions/581657/why-do-i-have-to-write-mypointervar-only-sometimes-inobjective-c – philant

+1

co jest specyficzne dla Objective- C to notacja @ "..." dla obiektu typu string. W kakao klasą takich obiektów łańcuchowych jest NSString. – mouviciel

Odpowiedz

24

an * jest tak naprawdę operatorem, aby odreagować wskaźnik. Jedyny czas, który oznacza "hej jestem wskaźnikiem" jest podczas deklaracji zmiennej.

Foo* foo // declare foo, a pointer to a Foo object 
&foo  // the memory address of foo 
*foo  // de-reference the pointer - gives the Foo object (value) 
+4

Nie oznacza to nic innego podczas deklaracji - 'Foo * foo' jest w rzeczywistości' Foo * foo', jak w, "' * foo' jest 'Foo'. Jest całkowicie spójny. – andyvn22

+0

Czy to ważne, gdzie umieszczasz gwiazdkę podczas deklaracji? Jaka jest dobra praktyka? (np. 'Foo * foo' i' Foo * foo') –

0

Jak powiedziałem w my answer of your previous question, @"yep" już jest wskaźnik, więc nie ma potrzeby * przed myString który jest również wskaźnik. W takim przypadku można przypisać wskaźniki, a nie wartości.

4

Studnia mmattax objęła rozróżnienie między deklaracją (jako wskaźnikiem) a dereferencją.

Jednakże, jak do punktu informacji:


    (*myVar).myStructComponentX = 5; 

dostępu do członka instancji C struktury (jak to jest), można zrobić to, co zrobiłeś, lub bardziej powszechnie używanej notacji -> :


    myVar->myStructComponentX = 5; 

Cel-C jest nieco mylący, ponieważ ostatnio (w ObjC 2.0) wprowadziła właściwości składni, która jest skrótem dla:


    int val = [myObject someIntProperty]; 

i może być teraz zapisywane jako


    int val = myObject.someIntProperty; 

To Objective C (2.0) składnia dostępu do nieruchomości, która Cię zadeklarował (nie jest to faktyczna zmienna składowa), podczas gdy twój przykład miał dostęp do członka struktury C.

Upewnij się, że wyraźnie widać różnicę.