Что означает Звездочка * в Objective-C? - PullRequest
23 голосов
/ 24 февраля 2009

Правда ли, что Звездочка всегда означает «Эй, это указатель!» А указатель всегда содержит адрес памяти?

(Да, я знаю, за исключением того, что * используется для математических операций)

Например:

NSString* myString;

или

SomeClass* thatClass;

или

(*somePointerToAStruct).myStructComponent = 5;

Я чувствую, что мне нужно знать больше об Asterirsk (*), чем о том, что я использую его при определении переменной, указывающей на класс.

Потому что иногда я уже говорю в объявлении параметра, что переменная Parameter является указателем, и все же я должен использовать звездочку перед переменной, чтобы получить доступ к значению. Это недавно произошло после того, как я захотел передать указатель структуры на метод таким способом, как [myObj myMethod: & myStruct], я не смог получить доступ к значению компонента из этой структуры, даже если в моем объявлении метода уже сказано, что есть параметр DemoStruct *) myVar, который действительно должен быть известен как указатель на этот демоструктуру, но мне всегда приходилось говорить: «Человек, компилятор. Слушай! 1016 *

Я действительно действительно не понимаю, почему я должен сказать это дважды. И только в этом случае.

Когда я использую Asterisk в контексте NSString * myString, тогда я могу просто получить доступ к myString, как мне нравится, не сообщая компилятору каждый раз, что это указатель. то есть как использование * myString = @ "yep".

Это просто не имеет смысла для меня.

Ответы [ 3 ]

26 голосов
/ 24 февраля 2009

an * на самом деле является оператором для отмены ссылки на указатель. Единственный раз, когда это означает «эй, я - указатель» во время объявления переменной.

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 голосов
/ 24 февраля 2009

mmattax хорошо охватывает различие между объявлением (в качестве указателя) и разыменованием.

Однако, что касается вашей точки зрения о:


  (*myVar).myStructComponentX = 5;

для доступа к члену экземпляра структуры C (как это есть) вы можете делать то, что вы делали, или чаще вы используете запись ->:


  myVar->myStructComponentX = 5;

Objective-C немного запутан здесь, потому что недавно (в ObjC 2.0) введен синтаксис свойства , что является сокращением для:


  int val = [myObject someIntProperty];

и теперь может быть записано как:


  int val = myObject.someIntProperty;

Это синтаксис Objective C (2.0) для доступа к объявленному вами свойству (а не к фактической переменной-члену), тогда как в вашем примере был доступ к члену структуры C.

Убедитесь, что вы четко понимаете разницу.

0 голосов
/ 24 февраля 2009

Как я уже говорил в , мой ответ на ваш предыдущий вопрос , @"yep" уже является указателем, поэтому нет необходимости в * перед myString, который также является указателем. В этом случае вы назначаете указатели, а не значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...