关于const 修饰的一些知识

1、前言

  1. const 修饰的是后面的东西
  2. 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.分析
1. * a:const*a 之间*

  1. 这时候,const修饰的是a,也就是a指针变量的地址,这时候a存的是字符串常量区的@“a”的地址。
    1. 所以按常理来说可以改变*a,但是不能改变a的值。
    2. 但是这里*a也是改变不了的,下面扩展会讲到
  2. * 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
  3. A*前有const,*A之间也有const
    综上a、b、c、d的分析,A 就很容易被理解了。

3、扩展.字符串的特殊性

为什么*a的值不能改变?
1. 字符串是存在字符串常量池里面,然后要是有个指针想要指向一个字符串,先会到字符串常量区进行查找
2. 如果没有,就在字符串的常量区创建一个,把指针指向字符串常量区
3. 如果有,就直接把指针指向字符串的常量区。
4. 所以,相同内容的字符串指针,其指向的内存地址都是一样的, 但是这个些字符串的指针变量的内存地址则可以是不同的。

关于字符串的存储请看这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值