变量的存储类别

  • 局部变量
  1. 普通局部变量(自动变量)   

     • 在一个函数内定义,只在函数范围内有效。

       • 在复合语句中定义,只在符合语句中有效。

       • 随着函数调用的结束或复合语句的结束而消亡。

       • 如果没有赋初值,则内容为随机值。

  2.静态局部变量static

   • 作用域:定义的函数内有效。

     • 生命周期:在定义的整个周期,静态局部变量始终从在着,即使退出函数,仍然存在。

     • 初值:若未赋以初值,则由系统自动赋值;数值型变量自动赋值为0,字符型变量赋空字符。

  • 全局变量

   1.普通全局变量

      • 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明。

      • 生命周期:在程序运行的整个周期都存在。

      • 不同文件的全局变量不可重名。

    2. 静态全局变量static

      • 在函数外定义,作用范围被限制在所定义的文件中,即其它文件中的函数没法使用。

       • 不同文件静态全局变量可重名,但作用域不冲突。

       • 生命周期:整个程序运行的周期。

    3.说明

      • 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。

      • 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。

  • const型变量

    •  一个变量声明为const变量,意味着该变量是一个常量,不可被修改。

    • const变量在定义的时候进行初始化。

    • 在使用过程中const修饰的变量只能做右值而不能做左值。

    • 一般用于修饰一些不想程序中对其值发生改变的变量。

  • register型变量

    • 告诉系统register修饰的变量将被频繁使用,对其分配地址时尽量将其分配在寄存器中,以提高访问速度。

    • 这个修饰词只是告知CPU尽量将变量分配在寄存器中,不一定真的分配(可能优化处理)。

    • register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。

    • 局部变量和形参可作为register变量,全局变量或静态变量不行。

    • register变量可能不存放在内存中,不能用取地址运算符“&”来获取register变量的地址,也不能用指针来操作。

  • volatile型变量(易失变量)

    • 表示变量是易失的,易变的。

    • 强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存中取值。

    使用情况:

      • 并行设备的硬件寄存器(如:状态寄存器)。

      • 一个中断服务子程序中会访问到的非自动变量(全局变量、静态变量)。

      • 多线程应用中被几个任务共享的变量。

原文地址:https://www.cnblogs.com/lemongirl/p/7887333.html