1、前言
- const 修飾的是后面的東西
- const修飾的東西不可變
2、驗(yàn)證
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ào)錯(cuò)
b = aa;
c = aa;
d = aa;
A = aa;//報(bào)錯(cuò)
//下面全部報(bào)錯(cuò)
*a = aa;
*b = aa;
*c = aa;
*D = aa;
*A = aa;
}
2.分析
- ** a:
const
在*
與a
之間**
- 這時(shí)候,
const
修飾的是a
,也就是a指針變量的地址,這時(shí)候a
存的是字符串常量區(qū)的@“a”
的地址。
- 所以按常理來說可以改變
*a
,但是不能改變a的值。 - 但是這里
*a
也是改變不了的,下面擴(kuò)展會(huì)講到 - ** b、?c 、 d : 都在
*
之前**
b = @"a";//const 在“*” 與 “NSString”之間
c = @"a";//const 在“NSString”前面
d = @"a";//const 在最前面
b 、c、 d的const 分別修飾的是b、c、*d
b對(duì)應(yīng)的語義為b指針指向的內(nèi)存空間的值。所以,可以改變b,但是不能改變b
- A
*
前有const
,*
與A
之間也有const
綜上
a、b、c、d
的分析,A 就很容易被理解了。
3、擴(kuò)展.字符串的特殊性
為什么*a的值不能改變?
- 字符串是存在字符串常量池里面,然后要是有個(gè)指針想要指向一個(gè)字符串,先會(huì)到字符串常量區(qū)進(jìn)行查找
- 如果沒有,就在字符串的常量區(qū)創(chuàng)建一個(gè),把指針指向字符串常量區(qū)
- 如果有,就直接把指針指向字符串的常量區(qū)。
- 所以,相同內(nèi)容的字符串指針,其指向的內(nèi)存地址都是一樣的, 但是這個(gè)些字符串的指針變量的內(nèi)存地址則可以是不同的。