存储类关键字
auto :修饰局部变量,分配在栈上(既然在栈上,说明它如果不初始化那么值就是随机的),
平时定义局部变量时就是定义的auto,只是省略了auto关键字而已。
static :可修饰局部变量也可修饰全局变量。如果局部变量用static修饰时为静态局部变量,
它只能在函数内部使用但是一直占据存储空间的变量。(静态局部变量占用内存时间长可读性差,
因此,除非必要,尽量避免使用局部变量。当多次调用一个函数且要求在调用之间保存某些变量的
值时可考虑采用静态局部变量。)
如果全局变量用static修饰时为静态全局变量,全局变量本身就是静态存储方式,静态全局变量也是静态
存储方式,这俩这在存储方式上并无区别。
全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量
的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用
例:
非静态全局变量对整个源程序都有效,所以在做静态库开发时用到全局变量都要用static修饰成静态的,
避免接入静态库的程序中全局变量与静态库中的全局变量冲突。
那么一个.m文件要使用另一个.m文件中的全局变量该怎么处理?很简单,使用extern关键字修饰。
extern:
APPdelegate.m中定义的全局变量ZXYToken想在ViewController中使用
可以打印出字符串:zhouxiangyu
如果在APPdelegate.m中定义的是static静态的全局变量,那么在ViewController中这么写就
会报错。
(extern 的工作原理:先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。)
const: http://mp.blog.****.net/postedit/79034651
const 与 static 联合使用
const和static替代宏与宏的区别:
register:
这个关键字请求编译器尽可能地将变量存储在CPU内部寄存器中,而不是通过内存寻址访问以提高效率。注意 是尽可能,不是绝对。
注意: 1、register变量必须是能被CPU寄存器接受的类型,这意味着 register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。不能用取址符"&"来获取 register变量的地址
volatile:略
typedef:
typedef是C中的关键字,它的主要作用是给一个数据类型定义一个新的名字,一般用于简化较为复杂的类型声明。
例:
在结构体和block定义中比较常用到:
俩种写法是等效的。