Как использовать оператор унарного указателя (*) в C? - PullRequest
0 голосов
/ 01 ноября 2010

Я читаю книгу под названием Java и C: основные различия, Learn Objective-C для разработчиков Java.(мой опыт работы с C # / Java, так что концепция указателей и управляемой памяти для меня нова, поэтому, пожалуйста, потерпите меня)

В главе 2 в этом разделе поясняются указатели на следующем примере:

int i = 1;
int *iptr;
iptr = &i;
*iptr = 2;

Я понимаю выше, где *iptr - указатель, ему назначается место в памяти i, также из указателя iptr мы можем получить доступ к значению iptr, указанному с помощью синтаксиса *iptr.

Далее в книге есть следующий фрагмент:

//..    
NSMutableString *z = [[[NSNutableString alloc]init] autorelease];
[z appendString:@"Zombie "];
//...

Насколько я понимаю из главы 2, строка [z appendString:@"Zombie "] должна была быть [*z appendString:@"Zombie "] вместо этого, поскольку мы хотим, чтобы фактическаяNSMutableString, а не его указателю, для отправки сообщения appendString !?Я знаю, что ошибаюсь, и что-то упускаю, пожалуйста, укажите мне правильное направление.

Большое спасибо,

Джузеппе

Ответы [ 4 ]

6 голосов
/ 01 ноября 2010

В Objective-C вы всегда работаете с указателями на объекты (вы не можете создать объект в стеке).Сообщения всегда передаются указателям (хотя это только абстракция - более сложные вещи выполняются на уровне среды выполнения).

4 голосов
/ 01 ноября 2010

Простой ответ заключается в том, что синтаксис Objective-C не совпадает с простым языком C.

Да, объект Obj-C определен с нормальным синтаксисом C, поскольку на самом деле это указатель на структуруно затем используется без оператора * при работе с инструкциями Objective-C ..

На самом деле ничто не запрещает семантике Objective-C отправлять сообщение объекту через его указатель, поэтому просто не делайте этогобеспокойство.

В любом случае это относится к каждому объекту, но есть много typedefs (например, NSInteger), которые обертывают примитивные или структурированные типы C.Они могут быть использованы в C либо непосредственно работая с ними в стеке, либо путем их выделения.

2 голосов
/ 01 ноября 2010

Возможно, вы не знаете, что

NSMutableString *z = [[[NSNutableString alloc]init] autorelease];

является сокращенной формой

NSMutableString *z;
z = [[[NSNutableString alloc]init] autorelease];

Возможно, теперь это стало понятнее.Как сказал Мипади, в Objective-C вы всегда имеете дело с указателями на объекты, а не с реальными объектами (например, иногда в C ++)

1 голос
/ 01 ноября 2010

Обозначение в скобках [obj message] подразумевает, что obj является указателем на объект.Таким образом, * должно быть выражено.

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