c语言中变量的存储区域和时效

参考:C程序设计,谭浩强

一,大分类(从存储空间)

1:局部变量
在一个{ }之内定义的变量,作用区域只限于这个符号范围之内,通常包含的{ }有一个函数,主函数子函数等等,while,for循环等等。(关于for循环括号中定义的变量,作用区域多大,好像是根据编译器不同而不同,最好只在本循环内使用。)
2:全局变量
定义在函数体外部的变量,作用范围为本文件(一个c语言文件,即是以“.c”结束的文件)变量定义的地方到此文件结束的区域。如果定义在文件末尾,那么上面就不能用啦。所以最好将一个文件的全局变量放在预编译文件之后的地方,省的编译问题。

二:变量的存储类别(变量的存在时间)

用户可以使用的区域依次为:1,程序区;2,静态存储区;3,动态存储区
静态存储区:固定的存储区域,主要存放
                1:全局变量
                2:使用static申明的局部变量(静态局部变量只在编译的时候 赋初始值,默认为零,之后每次运行到此子函数使用的值是上次使用的时候计算的结果)

动态存储区:程序运行过程中动态分配的存储空间,主要存放 
                1:未声明或者使用auto声明的局部变量(因为局部变量默认就是auto型的,这里的变量就是 每次调用就赋初始值,默认不确定
                2:函数的形式参数,其实也是子函数(被调用函数的局部变量,至少可以这样理解,都是出了这个函数就无效了)
                3:函数调用的现场保护和返回地址(子函数调用的时候,会将父函数的一些变量暂时压入栈中进行保护)

寄存器存储区:在一个函数运行过程中,有些变量需要高频率使用而加的一种声明方式
                但是它只能声明 使用动态存储的局部变量(我觉得这是合理的,因为寄存器资源十分珍贵,不可能任由静态存储的一些变量总是霸占着,这是资源的浪费)


extern声明方式:适用于需要在其他文件中使用的全局变量,在本文件定义,在需要使用的其他文件声明即可使用。
                但是这引入一个问题,有些全局变量并不想被其他文件使用,那么只需在本源文件定义出加上静态static声明即可。

三:关于声明和定义
 程序有声明和执行两部分组成,声明根据是否分配存储空间分为两类
                一类是分配存储空间的声明, 俗称定义
                一类是不分配存储空间的声明, 俗称声明
                例如:文件A中,定义全局变量int a;//这个语句执行的结果是在静态存储区给a分配了32bit,也就是4个字节的存储空间供它使用
                           文件B中,想要使用a,因此添加了语句 externa a;//此处的语句,不分配存储空间,仅仅是一个声明。

四:内部函数和外部函数

默认情况下,文件中定义的函数为外部函数,即其他文件的父函数想要使用此函数,只需要相应的声明之后就可以使用了
               但是有些情况下,不希望函数被其他文件的函数调用,即使该父函数声明了也不能使用,这就需要在函数定义的时候 加上static的声明标签。 

五:个人小结:
关于上述基础知识就没有多说的必要了,仔细体会即可,这个时候我们主要将这些东西与c++做一些类比
                在c++中关于声明有两个关键字:public,private;
                对比此处的extern 和 static 似乎是很有一番相似之处,可以仔细体会,这里的一个文件做单元,换到c++中就是以一个class做单元。
          具体的问题,由于本人目前c++只是浅陋,留待后文。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值