Почему использование указателей экземпляров отличается от использования числовых указателей (target-c, Mac) - PullRequest
2 голосов
/ 13 апреля 2011

Недавно я начал изучать target-c на Mac, но я наткнулся на базовое понимание использования указателей.До сих пор у меня появилась идея работать с числовыми указателями:

int x = 1; // initializing main variable x
int *y; //  initializing variable y of the int type pointer
y = &x; // passing the reference
*y = *y + 1; // working with a value via passed reference

Давайте рассмотрим другой пример, например, с объектом NSString:

NSString *comp; // initializing a pointer of NSString type. 
comp = @"Mac"; // ???

Проблема в том, что я неПонимаете, почему можно использовать comp = @ "Mac" без звездочки вместо использования с * comp = @ "Mac" ?Это какой-то ярлык при работе с указателями объектов?Было бы более понятно (для меня :)), если бы одинаковые синтаксические правила применялись как к указателям на простые типы данных, так и к указателям на типы объектов.Я знаю, что почти все объектные переменные являются указателями в target-c, но в чем причина такого синтаксиса?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Объекты Objective C не являются значениями в том виде, в котором они приведены в ваших числовых примерах.Фактическая структура данных в значительной степени непрозрачна для программиста и управляется средой выполнения.Все, с чем вы имеете дело, это указатель на него.На самом деле вы никогда напрямую не изменяете указанный материал, а отправляете сообщения, которые приводят к его изменению.Принимая во внимание, что с помощью простого указателя на int вы тут же получаете право и сами изменяете содержание (значение x).

Пример NSString представляет собойнемного особый случай, и это не является неразумным, чтобы найти его запутанным.Дело в том, что этот бит: @"Mac" создает экземпляр памяти строкового объекта где-то, но то, что он фактически возвращает вам для назначения, - это только указатель на этот объект.Итак, эта строка:

comp = @"Mac";

- это присвоение указателя (@"Mac") справа переменной указателя (NSString* comp) слева.Ни с одной, ни с другой стороны вы действительно имеете дело со значением непосредственно, оно просто выглядит как вы.

Причина, по которой все это работает именно так, а не, возможно, более интуитивно, как в Java, заключается в том, чтовсе это основано на C и использует тот же синтаксис.Но преимущество, как только вы привыкнете к этому, заключается в том, что он должен служить постоянным напоминанием о том, что вы когда-либо имеете дело только с ссылкой на ваши объекты, а мелкие мелочи управляются за кулисами.(Это хорошо, честно.)

1 голос
/ 13 апреля 2011

Поначалу это может быть очень запутанным, но гораздо легче понять, когда вы разбиваете цель каждого оператора.

Амперсанд (&) является опорным оператором, он просто возвращает адрес в памятиопределенная переменная.

int a = 5;
// a  == 5        the value
// &a == 0x1000   the address

Звездочка (*) является оператором разыменования, значение указателя является адресом, а использование звездочки вызывает возврат значения того, на что оно указывает.

int a = 5;
int b = &a;
// a  == 5        the value
// &a == 0x1000   the address
// b  == 0x1000   the value of b is the address of a
// *b == 5        the value of b is an address that points to the value of 5

Так что в случае ...

NSString *aString;
aString = @"this is a string"

То, что происходит за кулисами, это адрес @ "это строка" присваивается значению aString.При использовании строки вы не разыменовываете ее, потому что это будет просто указывать на значение, которое занимает первый блок памяти, который занимает объект, что бесполезно, поскольку вы работаете со всем объектом в целом.

0 голосов
/ 13 апреля 2011

Звездочка используется только в объявлении переменной, чтобы сказать, что значение является указателем, и вне этого оно будет разыменовывать указатель, как вы указали в первом примере. *y = *y + 1

@ "" литералNSString * (указатель NSString), похожий на литерал "", являющийся const char * (постоянный указатель символа).

В вашем примере это то же самое, что сделать следующее.

NSString *comp;
comp = @"Mac";
//^^ is the same as
NSString *comp = @"Mac";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...