static, const, extern 关键字
最近准备后顾 iOS 相关的基础知识,首先想到从 static,const,extern 等关键字的用法和特性开始复习,但当我进行过程中,发现自己连变量的定义和作用域都不甚了解。。。这篇文章将为各位展示一个工作两年,却如同小白的我复习的过程以及思路。
1. 起初我只想知道 static 的作用是什么?
于是我申明了在两个类中各一个 static 的NSString
打印结果跟我之前的理解差距不大 static 修饰的全局变量:内存分配在全局/静态存储区 ,会一直保留在程序结束。
不要 static 有什么区别?
于是我把两个类中的 static 去掉,command + b 编译结果如下
编译器说 _staticStr 重复定义了。。。
吓得我赶紧打开了百度(这他*得感谢 LOL 陪伴我大学计算机专业四年),一搜才发现:原来在这个地方申明的是全局变量,作用域是所有文件,所以两个类文件中重复申明了。而 static 其实有三个作用 (1)隐藏作用域:修饰的全局变量只在本编译单元有效;2.延长生存期:局部变量使用 static 让其不会在函数结束时销毁;3.默认初始化为 0 。
无意中接触到了符号表这个词(这他*得感谢 LOL 陪伴我大学计算机专业四年):大概意思就是符号表中有内存地址和函数/变量的对应关系,编译时节点的各种属性(类型,作用域,分配空间大小,(函数)的参数类型)等。供连接时给其他模块引用。
通俗的说:就是有一张表保存着变量的作用域和类型等信息。如果同一作用域下面有两个相同的变量,那么链接的时候报错,而 static 的作用就是表示这个变量是某个编译单元中的私有全局变量。
2. static 总结
static 修饰的变量/函数:1.内存只初始化一次;2.生存期到程序结束;3.改变作用域。
static 修饰的变量:默认初始化为 0.
const 的作用?
故事开始于一道面试题:
面试官:这里的 const 起了什么作用?
我:保证传入的形参数据唯一性。
面试官:那这样呢?
我:额…(这他*得感谢 LOL 陪伴我大学计算机专业四年)
可能大家都知道这道题的答案:形参其实是 copy 传入的值到新的内存空间,而这里的 const int * 保证的地址不可变,还是使用的之前那块内存。
extern const 搭配有撒用?
这里还有个故事:
面试官:static 和 extern 有什么区别?
我:(这他*得感谢 LOL 陪伴我大学计算机专业四年)
面试官:我给你讲讲编译,链接,,相对地址,,
我:。。。。。
static 作用:略。
extern 作用:此变量/函数是在别处定义的(不定义会报链接错误),要在此处引用。
未完。。。