这是一个令人尴尬的简单问题,当我深入研究目标C时,我无法找到答案:
在声明或分配变量时,是否存在指针指针'*'的含义?
我看到过以不同方式定义的变量:
NSString *BLANK_SPACE = @" ";
NSString const *BLANK_SPACE = @" ";
NSString * const BLANK_SPACE = @" ";
现在我知道了CONST修饰符的含义,但我把它放在那里只是因为当我看到星号用空格分隔时,它通常在CONST修饰符之前。
有人可以解释在声明/分配变量时将*放在哪里的理由吗?有什么区别?
答案 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