当前位置: 代码迷 >> 综合 >> 变量:全局变量,局部变量,静态变量,动态变量
  详细解决方案

变量:全局变量,局部变量,静态变量,动态变量

热度:86   发布时间:2023-12-12 00:12:31.0

讨论变量主要从以下三点来进行分析:

  1. 变量的作用域
  2. 变量的生存周期
  3. 变量保存的空间

从变量的作用域来区分:变量分为全局变量和局部变量

局部变量:在函数内定义的变量,作用域限于函数内

  • 主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。
  • 形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。
  • 允许在不同的函数中使用相同的变量名,但它们代表不同的对象,占用不同的存储单元,互不干扰。
  • 在复合语句中(如while、if、for等语句里面)也可以定义变量,但其作用域只能在复合语句内。

全局变量:在函数外定义的变量,它的作用域是从变量定义开始,到程序结束

  • 如果非定义全局变量的文件中要使用该外部变量,要使用关键字extern声明变量才能够使用。
  • 全局变量能由声明的文件中所有函数都能引用全局变量的值,而在一个函数中能够改变了变量的值会对其他函数产生影响,所以在使用中需要注意变量的安全性,如果在多线程中需要全局变量则需要给全局变量操作的语句加上线程锁或者原子操作。
  • 全局变量和局部变量同名时,在函数中全局变量隐藏,局部变量起作用。

从变量的生存周期来区分:变量分为静态变量和动态变量

动态变量:动态变量在函数调用时分配存储空间,函数调用结束后释放存储空间。它可以是函数的形参,局部变量,函数调用时的现场保护和返回地址。

  • 动态变量使用auto关键字修饰,一般可以忽略默认为动态变量。
  • 动态变量中有使用关键字register修饰的寄存器变量,不存入内存,直接保存在CPU内的寄存器中,提高执行速度。一般把使用最频繁的变量定义为register变量,如循环变量。

静态变量:在运行期间由系统分配固定的存储空间。它可以是全局变量,也可以是局部变量。

  • 静态变量使用关键字static修饰分为静态局部和静态全局。
  • 静态局部变量:它和局部变量的区别在于函数退出时,变量始终存在,但不能被其他函数使用,当再次进入该函数时,能保存上次的结果继续使用。如果不赋初值,则自动赋初值0或空字符。
  • 静态全局变量:只在定义它的源文件中可见,在其他源文件中不可见。它和全局变量的区别是,全局变量可以使用关键字extern被其他源文件使用,而静态全局变量不能。

从变量存放的空间来分析

局部变量: 栈区
局部静态变量:静态区
全局变量: 静态区
全局静态变量:静态区

C语言分为五大内存分区:

  • 栈区(stack): —由编译器自动分配释放,存放函数的参数值,局部变量的值等。
  • 堆区(heap): 一般由程序员分配释放,若程序员不释放,程序结束时由系统释放,C语言中使用malloc、calloc、realloc动态分配堆的空间,使用free释放空间。
  • 全局区(静态区,static):
    全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
  • 文字常量区: 常量字符串就是放在这里的,如数字,字符串等。程序结束后由系统释放。
  • 程序代码区: 存放函数体的二进制代码。
  相关解决方案