美文网首页
浅谈 Const、Exetrn和Static

浅谈 Const、Exetrn和Static

作者: 微笑_d797 | 来源:发表于2019-07-24 15:12 被阅读0次

Const

const修饰常量 被const修饰的属性不能改变:

/// 普通变量
NSString * str = @"变量字符串";
str = @"改变变量";
str是一个指针 当他赋值给“改变变量”就是str的指针指向发生了改变 “改变变量” 是有自己的内存地址

const 修饰的指针,str1指向的地址不可改变,但是str1指向地址的内容可以改变。
NSString * const str1 = @"常量字符串";
str1 = @"尝试改变常量"; /// 这句代码会报错://Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong'
&str1因为被const修饰是固定的不可被改变的 但是 "常量字符串" 所在的内存地址是**可以**被改变的,如果改变地址内容则访问str1则为改变后的内容

str2指向地址的内容不可改变,但是str2指向的地址是可以改变的
NSString const * str2 = @"常量字符串";
const NSString * str2 = @"常量字符串";
//上述操作没有区别
str2 = @"尝试改变常量";

&str2是可以被改变的但是"常量字符串" 所在的内存地址是**不可以**被改变
str2可以指向其他地方就是当重新赋值不会报错 但是那块内存地址是不会改变的字符串依然是 “常量字符串”

static和exetrn

static

在全局变量前加static,全局变量就被定义成为一个全局静态变量,全局变量和静态全局变量的生命周期是一样的,都是在静态区,在整个工程执行期间内一直存在)全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
特点如下:
1)存储区:有栈变为静态存储区rw data,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,
但不能使用它;
2)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用
好处:
1)其他文件中可以定义相同名字的函数,不会发生冲突
2) 静态函数不能被其他文件所用。

exetrn

只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量(先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。)

static和const 联合使用

开发中常用static修饰全局变量,只改变作用域,为什么要改变全局变量作用域,防止重复声明全局变量。
开发中声明的全局变量,有些不希望外界改动,只允许读取。
比如一个基本数据类型不希望别人改动
声明一个静态的全局只读常量

static const int a = 20;

staic和const联合的作用:声明一个静态的全局只读常量
iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.

// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
 static  NSString * const key = @"name";
// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。
 static  NSString const *key1 = @"name";

extern与const联合使用

开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合
因为 static与const组合:在每个文件都需要定义一份静态全局变量。 extern与const组合:只需要定义一份全局变量,多个文件共享。

宏跟Const的优劣

总结

被const修饰的指针 如果是 const * p 则p的指向可以改变 但是他指向的内存地址不能改变(比如这块内存地址定义一个字符串不可以被重新赋值),如果是 * const p 则是 p的指向不可以改版,但是他的内存地址的内容共可以改变。

被static修饰的全局变量只能在局部生效,但是生命周期为整个app的生命周期即使出了作用域他一直存在。

exetrn则是用来获取全局变量(包括全局静态变量)的值不能主动赋值

相关文章

  • 浅谈 Const、Exetrn和Static

    Const const修饰常量 被const修饰的属性不能改变: static和exetrn static 在全局...

  • C语言day10-04static和exetrn对函数-作用

    pragma mark static和exetrn对函数-作用 pragma mark 概念 pragma mar...

  • const、static、extern、宏

    const static extern 宏 const与宏的区别 static和const的联合使用 extern...

  • 浅谈const, static, extern

    废话不多说,直接上!!! const const常量与宏的区别,很多同学喜欢宏来定义常量,其实这里是不推荐的(苹果...

  • <三>关于const、static、extern、宏

    1.const2.static3.extern4.宏5.const与 宏的区别6.static 和 const 的...

  • C++笔记

    2. Const 和 Static Const相关注意 ◼ 静态成员:被static修饰的成员变量\函数​ ...

  • static和const

    static 修饰局部变量:修改的是生命周期 1> 被static修饰的局部变量,在整个程序运行过程中都只有一份内...

  • static和const

    static static关键字修饰局部变量: 当static关键字修饰局部变量时,只会初始化一次且在程序中只有一...

  • static-02-const 联合使用

    static 防止重复声明, const 防止修改变量(防止修改const后面部分) static const N...

  • const/static/extern/const/static

    const -- 常量 const中文意思是“常量”,不可改变的固定的。const关键字主要作用: const ...

网友评论

      本文标题:浅谈 Const、Exetrn和Static

      本文链接:https://www.haomeiwen.com/subject/ucyxrctx.html