关于const 修饰的一些知识

1、前言

  1. const 修饰的是后面的东西
  1. 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也是改变不了的,下面扩展会讲到
  3. ** 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

  1. A*前有const,*A之间也有const

综上a、b、c、d的分析,A 就很容易被理解了。

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

为什么*a的值不能改变?

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 7,717评论 0 10
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,374评论 0 6
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,479评论 3 44
  • 杨晓东,江湖人称老杨,核桃品牌策划CEO,核桃帮创始人 晚上约了女朋友,去吃啥好呢~~毕竟不能再去肯德基喝可乐了....
    老杨开窍阅读 150评论 0 0
  • (一) 又做梦了,这个时间醒来着时又点早,黑黑静静的夜,透露着一种清醒的可怕,这种感觉不能说不好,也不能说好,太过...
    雨竹姑娘阅读 221评论 0 1