是否将指针指针“*”放在Objective-C中的含义是什么?

时间:2011-08-29 00:36:51

标签: objective-c

这是一个令人尴尬的简单问题,当我深入研究目标C时,我无法找到答案:

在声明或分配变量时,是否存在指针指针'*'的含义?

我看到过以不同方式定义的变量:

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

现在我知道了CONST修饰符的含义,但我把它放在那里只是因为当我看到星号用空格分隔时,它通常在CONST修饰符之前。

有人可以解释在声明/分配变量时将*放在哪里的理由吗?有什么区别?

3 个答案:

答案 0 :(得分:9)

const是一个后缀运算符,它指的是左边的东西,而不是右边的东西。如果const首先出现,那么它将适用于它之后的第一件事。 const NSString *foo(以及NSString const *foo)表示它是指向const NSString的非const指针 - 指针值可以重新分配,但指向的数据是不可变的。 NSString * const foo表示它是指向非const NSString的const指针 - 指向的数据可以更改,但指针引用的位置不能更改。

*与该线的其他部分之间的间距只是风格和清晰度的问题。

答案 1 :(得分:2)

诀窍是从右到左阅读声明。所以:

NSString  *BLANK_SPACE 

从右到左...... BLANK_SPACE是指向NSString的指针。

NSString const *BLANK_SPACE

从右到左...... BLANK_SPACE是一个指向const NSString的指针。

NSString * const BLANK_SPACE

从右到左...... BLANK_SPACE是一个指向NSString的const指针。

最后,

NSString const * const BLANK_SPACE

从右到左...... BLANK_SPACE是一个指向const NSString的const指针。

答案 2 :(得分:1)

*相对于变量名的位置对编译器无关紧要。有些人更喜欢将*与变量放在一起,因为它避免了在声明多个变量时可能出现的混淆:

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中的对象,而不是通过直接更改对象的ivars,我不相信编译器会阻止通过消息进行的更改。因此,const指针是有意义的,指向const对象的指针,而不是:

NSString * const BLANK_SPACE = @" "; // makes sense; pointer BLANK_SPACE can't change
NSString const * BLANK_SPACE = @" "; // not useful