C-存储类型初始化链接属性的记录

Posted taocr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C-存储类型初始化链接属性的记录相关的知识,希望对你有一定的参考价值。

存储变量值的内存类型即存储类型。 总共三个地方:普通内存、运行时堆栈和硬件寄存器 1、在代码块外声明的变量存储于静态内存中,不属于堆栈,即静态变量       程序运行之前创建,整个执行期间都存在 2、代码块内部即存储于堆栈内,自动变量,程序执行完这个代码块即删除此中的自动变量         程序执行到此代码块时,自动变量创建,代码块执行完毕后则消失         再次创建的话,值也不是上一次给的值         即局部变量:原因是它们位于函数内部,没有链接属性,不能在函数外部通过名字访问        int a;   此若在函数内则是代码块内的缺省存储类型,即自动为auto        static int a ;    此即指明了为静态存储类型,就算在代码块内也一样是静态变量,整个程序执行期间都存在
3、寄存器变量的声明用register关键字,变量值存储于寄存器中,访问效率更高,但是编译器可能会忽视,因为很有可能省下来的时间和空间的开销还抵不上复制所用的值消耗的开销         函数开始执行时,需要使用的寄存器的内容会都复制至堆栈中,而函数返回时,则再复制回去         寄存器变量的存储值如果不被初始化也是垃圾,只有静态变量可以不需要被初始化
初始化: 静态变量:可以将要初始化的值放在可执行文件执行时变量所使用的位置上,即可初始化(这样就是说可以提前计算出变量存储的内存地址,不过还不清楚如何计算                   如果不在程序中对其初始化则其内容为0,不是自动变量的随机数。 自动变量:程序链接时还无法判断自动变量的存储位置。如果不对其给初值,则其中存着的不是0,而是垃圾。

static关键字:             用于函数定义或者是代码块以外的变量声明时,其修改标识符的链接属性,从external变为internal(内部,同个源文件内所有声明指向同个实体,但是不同源文件则指向不同的个体),但是存储类型和作用域不受影响,而默认如果缺省的话则为external(外部,不同源文件内的任意多次声明都指向同一个实体),此为链接属性。             用于代码块内部的变量声明时,修改变量的存储类型,即auto改为static,从自动变量改成静态变量。
作用域: 1、文件作用域:任何代码块之外的标识符,都有着文件作用域,即从他们声明的地方一直到源文件结尾都可以访问,但是如果是external属性即其他的源文件也可访问时,则需要进行再一次的声明,而且要注意添加extern关键字,即extern int x;         这里通过#include指令包含到其他文件中的声明就好像是直接写在里面一样,因此作用域并不局限于所标示的头文件的文件尾部,即你的程序中也相当于直接定义了,所以可以直接使用 2、原形作用域和函数作用域         这个还不是太懂,先留在这里,后面补充 3、代码块作用域:这个很好理解,就是代码块内部定义的标识符都有着此作用域,只能用于此代码块内,而其他代码块无法调用,除非在代码块内用static这个指令让其成为静态变量(全局变量)

以上是关于C-存储类型初始化链接属性的记录的主要内容,如果未能解决你的问题,请参考以下文章

c语言中float类型变量的默认初始值是啥?

在c语言中给变量赋初值有啥作用

4.7 C语言的存储类,作用域,生命周期,链接属性

C语言指针变量为啥要赋初值?

asp.net 使用存储过程时参数为空时的处理

double java默认初值