1、前言
- const 修饰的是后面的东西
- const修饰的东西不可变
2、验证
1. 代码
static NSString *const a = @"a";//const 在“*” 与 “a” 之间
static NSString const* b = @"a";//const 在“*” 与 “NSString”之间
static const NSString *c = @"a";//const 在“NSString”前面
const NSString static *d = @"a";//const 在最前面
static NSString const * const A = @"a";//*前有const,* 与 A 之间也有const
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUP];
}
- (void)setUP {
NSString *aa = @"a";
a = aa;//报错
b = aa;
c = aa;
d = aa;
A = aa;//报错
//下面全部报错
*a = aa;
*b = aa;
*c = aa;
*D = aa;
*A = aa;
}
2.分析
- ** a:
const
在*
与a
之间**
- 这时候,
const
修饰的是a
,也就是a指针变量的地址,这时候a
存的是字符串常量区的@“a”
的地址。
- 所以按常理来说可以改变
*a
,但是不能改变a的值。 - 但是这里
*a
也是改变不了的,下面扩展会讲到 - ** b、�c 、 d : 都在
*
之前**
b = @"a";//const 在“*” 与 “NSString”之间
c = @"a";//const 在“NSString”前面
d = @"a";//const 在最前面
b 、c、 d的const 分别修饰的是b、c、*d
b对应的语义为b指针指向的内存空间的值。所以,可以改变b,但是不能改变b
- A
*
前有const
,*
与A
之间也有const
综上
a、b、c、d
的分析,A 就很容易被理解了。
3、扩展.字符串的特殊性
为什么*a的值不能改变?
- 字符串是存在字符串常量池里面,然后要是有个指针想要指向一个字符串,先会到字符串常量区进行查找
- 如果没有,就在字符串的常量区创建一个,把指针指向字符串常量区
- 如果有,就直接把指针指向字符串的常量区。
- 所以,相同内容的字符串指针,其指向的内存地址都是一样的, 但是这个些字符串的指针变量的内存地址则可以是不同的。