iOS 基础知识--static,const,extern关键字用法

static, const, extern 关键字

变量及关键字特性

最近准备后顾 iOS 相关的基础知识,首先想到从 static,const,extern 等关键字的用法和特性开始复习,但当我进行过程中,发现自己连变量的定义和作用域都不甚了解。。。这篇文章将为各位展示一个工作两年,却如同小白的我复习的过程以及思路。

1. 起初我只想知道 static 的作用是什么?

于是我申明了在两个类中各一个 static 的NSString
这里写图片描述
打印结果跟我之前的理解差距不大 static 修饰的全局变量:内存分配在全局/静态存储区 ,会一直保留在程序结束。

不要 static 有什么区别?

于是我把两个类中的 static 去掉,command + b 编译结果如下

全局变量冲突

编译器说 _staticStr 重复定义了。。。
excuse me?

吓得我赶紧打开了百度(这他*得感谢 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 作用:此变量/函数是在别处定义的(不定义会报链接错误),要在此处引用。
未完。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值