Есть ли значение, приписываемое тому, куда вы помещаете указатель «*» в Objective-C? - PullRequest
7 голосов
/ 29 августа 2011

Вот неловко простой вопрос, на который мне не удалось найти ответ, когда я углубляюсь в Цель C:

Есть ли значение, приписываемое тому, куда вы помещаете указатель '*' при объявлении или присвоении переменной?

Я видел переменные, определенные по-разному:

 NSString  *BLANK_SPACE = @" ";
 NSString const *BLANK_SPACE = @" ";
 NSString * const BLANK_SPACE = @" "; 

Теперь я знаю значение модификатора CONST, но ставлю его только потому, что когда я вижу звездочку, разделенную пробелом, обычно перед модификатором CONST.

Может ли кто-нибудь объяснить обоснование того, куда ставить * при объявлении / назначении переменной? В чем разница?

Ответы [ 3 ]

9 голосов
/ 29 августа 2011

const - это постфиксный оператор, который ссылается на объект слева, а не справа.Если const идет первым, то оно относится к первому после него.const NSString *foo (а также NSString const *foo) означает, что это неконстантный указатель на const NSString - значение указателя может быть переназначено, но данные, на которые указывают, являются неизменяемыми.NSString * const foo означает, что это константный указатель на неконстантную NSString - данные, на которые указывает указатель, могут измениться, но местоположение, на которое ссылается указатель, не может.

Интервал между * и другими частями строкиэто просто вопрос стиля и ясности.

2 голосов
/ 29 августа 2011

Хитрость заключается в том, чтобы читать декларации справа налево. Итак:

NSString  *BLANK_SPACE 

Справа налево ... BLANK_SPACE - указатель на строку NSS.

NSString const *BLANK_SPACE

Справа налево ... BLANK_SPACE - указатель на постоянную строку NSString.

NSString * const BLANK_SPACE

Справа налево ... BLANK_SPACE - это константный указатель на строку NSSt.

Наконец,

NSString const * const BLANK_SPACE

Справа налево ... BLANK_SPACE - это константный указатель на константную строку NSString.

1 голос
/ 29 августа 2011

Положение * относительно имени переменной не имеет значения для компилятора.Некоторые предпочитают ставить * с переменной, потому что это позволяет избежать путаницы при объявлении нескольких переменных:

char* a, b;  // a is char* and b is char, but both look like char*
char *a, b;  // looks a little more like the truth: a is char*, b is char

Однако вы всегда ссылаетесь на объекты в Objective-C с помощью указателей,так что вы никогда не сделаете что-то вроде первой строки ниже:

NSString *a, b;  // WRONG: a is a pointer to an NSString object, b is just wrong.
NSString *a, *b; // OK: both a and b are pointers to NSString objects

Позиция const, с другой стороны, имеет значение:

int * const a; // a points to an int, and a can't be modified to point to some other int
int const * a; // a points to an int, and that int can't be changed

Теперь,const не имеет большого смысла в отношении объектов.С одной стороны, NSString представляет собой неизменяемую строку, поэтому объявление одной const мало что добавляет.С другой стороны, в общем случае объект модифицируется в Objective-C путем отправки сообщения, а не путем непосредственного изменения иваров объекта, и я не верю, что компилятор предотвратит изменения, сделанные с помощью сообщений.Следовательно, указатель const имеет смысл, указатель на объект const, не так много:

NSString * const BLANK_SPACE = @" "; // makes sense; pointer BLANK_SPACE can't change
NSString const * BLANK_SPACE = @" "; // not useful
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...