Что означает 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".
Мне это просто не имеет смысла.
Ответы
Ответ 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.
Удостоверьтесь, что вы четко различимы.
Ответ 3
Для других людей, которые новичок в Objective-C, как и я, этот учебник был действительно полезен для понимания звездочки и других основ:
Руководство для начинающих по Objective-C: язык и переменные
Ответ 4
Как я уже сказал в ответе вашего предыдущего вопроса, @"yep"
уже является указателем, поэтому нет необходимости *
до myString
, который также является указателем. В этом случае вы назначаете указатели не значения.