Objective-C中const NSString *与NSString * const的区别

47
我想在.h文件中定义一个NSString常量,并在.m文件中进行定义,正确的方式是在.h文件中使用 extern NSString * const variableName;,然后在.m文件中使用 NSString * const variableName = @"variableValue";。根据C语言的教程,我们可以看到const应该放置于变量定义之前。我的问题是:为什么不在.h文件中声明extern const NSString * variableName;,然后在.m文件中使用const NSString * variableName = @"variableValue";呢?这样做会导致编译器警告,指出“传递给方法methodName的第1个参数从指针目标类型中丢弃了限定符”,这是什么意思?
2个回答

64

它们并不相同。const修饰符可以应用于值,也可以应用于指向该值的指针。


int * const

一个指向整数的常量指针(不可修改),但是可以修改其所指向的值。


const int *

一个可修改的指向常量整数的指针(它的值不能被修改)


那么你可以想象:

const int * const;

29
如果你不涉及指针,那么 const intint const 是完全相同的。NSString 已经是不可变的,所以只需要将 const 应用于指针(由于 Objective-C 对象总是通过指针访问,这可能有点令人困惑)。 - Wevah
1
@Macmade 为什么你不用 NSString 的术语来解释呢,因为指针的语法本来就不同呢? - jpswain
1
深入解释一下,const int *int const * 是一样的,但是 int * const 是不同的。 - user102008
2
@Wevah:“NSStrings已经是不可变的了”,但是一个NSString指针仍然可以指向一个NSMutableString。 - user102008

6

常量指针并不是指向常量的指针。常量指针意味着指针是常量。例如,常量指针 int * const ptr2; 表示 ptr2 是一个常量指针。这意味着 ptr2 不能指向另一个整数。然而,由 ptr2 指向的整数可以被更改。

而指向常量的指针 const int * ptr1; 表示 ptr1 是一个指向常量整数的指针。整数是常量且不可更改。但是,指针 ptr1 可以被指向其他整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接