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

本文探讨了变量的三种存储类型:静态内存、运行时堆栈及寄存器,并介绍了static关键字的作用及其对变量存储类型的影响。此外,还讨论了变量的作用域,包括文件作用域、函数作用域和代码块作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储变量值的内存类型即存储类型。
总共三个地方:普通内存、运行时堆栈和硬件寄存器
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这个指令让其成为静态变量(全局变量)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值