Подтвердить что ты не робот

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

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

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

Пример:

NSString* myString;

или

SomeClass* thatClass;

или

(*somePointerToAStruct).myStructComponent = 5;

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

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

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

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

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

4b9b3361

Ответ 1

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)

Ответ 2

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.

Удостоверьтесь, что вы четко различимы.

Ответ 4

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