Что означает звездочка * в Objective-C?

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

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

Например:

NSString* myString;

или

SomeClass* thatClass;

или

(*somePointerToAStruct).myStructComponent = 5;

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

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

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

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

Для меня это просто не имеет смысла.

Ответов (3)

Решение

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

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)

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

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.

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