C基础(四)数据的存储类别

书目《C程序设计(第三版)

C语言中的变量和函数都有两个属性:数据类型数据的存储类别,通过数据类型可以获知变量占用内存的大小,通过数据的存储类别可以获知变量占用内存的区域和时间。

  • (一)局部变量和外部变量的定义
    1、函数内部定义的变量只在本函数范围有效,称为局部变量,形式参数也是局部变量,在程序块(例如if分支)中定义的变量只在程序块中有效;
    2、函数之外定义的变量称为外部变量外部变量是全局变量,它的有效范围是定义变量的位置开始到本源文件结束,如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”。

  • (二)存储区和存储方式
    1、 内存中供用户使用的存储空间分为程序区静态存储区(全局变量)、动态存储区(函数形式参数、未加static声明的局部变量、函数调用时的现场保护和返回地址等)。
    2、静态存储方式是指在程序运行期间由系统(在静态存储区)分配固定的存储空间的方式;
    3、动态存储方式是指在程序运行期间根据需要(在动态存储区)进行动态的分配存储空间的方式。

  • (三)4个重要关键字
    1、auto(自动的):
    用auto声明的局部变量称为自动变量,其存储空间自动分配和释放。该关键字可以省略,没有指明存储类别的,隐含确定为auto类别。
    2、static(静态的):
    A、如果希望局部变量的值在函数调用结束后不消失,并在下一次函数调用时继续使用,可以用static声明该局部变量。静态局部变量仅在编译时赋一次初值(如果定义时没有赋初值,编译时会自动赋值0或者空字符),函数调用结束后该变量仍然存在,但是其他函数并不能引用它。
    B、如果希望某些外部变量只限于被本文件引用,可以用static声明该外部变量。
    3、register(寄存器的):
    如果一些变量使用频繁,C语言允许将局部变量的值放在CPU的寄存器中,这样可以提高执行效率,此时用register声明该局部变量。
    只有局部自动变量形式参数可以作为寄存器变量。
    4、extern(外部的):
    用extern来声明外部变量,可以扩展外部变量的作用域,通常在外部变量定义之前或者另外的源文件中进行声明。

  • (四)关于变量的声明和定义
    声明时需要建立存储空间的(如int a),称为定义性声明,不需要建立存储空间的(如extern a)称为引用性声明,所以就广义的声明包括定义,而狭义的声明和定义就是引用性声明和定义性声明,下面所述均为狭义的:
    1、外部变量只能定义一次(并且只能在定义时初始化),但是可以声明多次;
    2、extern只能用于声明,不能用作定义;
    3、用auto、static、register声明变量时,应与该变量的定义同时进行。

  • (五)小结
    1、从作用域(空间)的角度分,有局部变量(自动变量,静态局部变量、寄存器变量)和外部变量(静态外部变量、普通外部变量);
    2、从生存期(时间)来分,有动态存储变量(自动变量,寄存器变量)和静态存储变量(静态局部变量、静态外部变量、普通外部变量);
    3、从变量存放的位置来分,有动态存储区(自动变量)、静态存储区(静态局部变量、静态外部变量、普通外部变量)和CPU中的寄存器(寄存器变量)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值