连接属性分为:external(外部连接),internal(内部连接),none(无)。
如何区分是那种连接属性:
(1)全局变量没有关键字 static 修饰的都是外部连接属性,也就是说在一个源文件中定义全局变量int k(源文件1),可以在其他源文件用 extern int k(源文件2)来使用源文件1 中的 变量k,
(2)用关键字 static 修饰的都是内部链接,如果 static 修饰的是全局变量,在该变量在该源文件中都可以用;如果 static 修饰的是局部变流量,则变量只在该函数内起作用,但是变量会一直存在,不会像none 类型的变量:在函数调用结束之后就消失。
关键字 static 和 extern 在变量声明时,修改变量的连接属性。(static 只能对缺省连接属性为 external 的变量进行修改,通用 extern 也不能修改static 的连接属性)
存储类型:
变量的存储类型是存储变量的内存类型,存储类型决定变量何时创建、何时销毁。
在内存中有三个地方可以存储变量:普通内存,运行时堆栈(malloc 等分配的内存),硬件寄存器。
静态变量:定义在代码块外的变量---->存储在普通内存中,也就是不在堆栈中,其特点是:在程序运行之前创建,在程序的整个执行期间一直存在。
自动变量:在代码块内部定义的变量,存储在堆栈中;程序执行到代码块时,自动变量才被创建,程序执行完该代码块后,自动变量自行销毁。
寄存器变量:一般使用频率较高的变量都会声明称寄存器变量。
寄存器变量的特点:寄存器变量的串讲和销毁时间同自动变量相同,但是需要额外的一些工作就是必须使寄存器变量的程序返回之前后恢复寄存器的值,一般情况下用堆栈来完成这个任务,也就是在程序开始执行之前,将寄存器的值存储在堆栈中,程序完成后,用堆栈回复寄存器的值。
下面一张表是 C 和 Pointer 的总结,非常好:
变量类型 | 声明位置 | 是否存储于堆栈 | 作用域 | 如果声明为 static |
全局 | 所有代码块之外 | 否 | 从声明到文件尾部 | 不允许从其他源文件访问 |
局部 | 代码块起始处 | 是 | 整个代码块 | 变量不存储于堆栈中,他的值在整个程序执行过程中一直 存在 |
形式参数 | 函数头部 | 是 | 整个函数 | 不能 |