static、局部变量、全局变量

title : static、局部变量、全局变量
category : IOS
static、局部变量、全局变量 标签(空格分隔): IOS
[TOC]
局部变量 定义
【static、局部变量、全局变量】在函数内部或复合语句内部定义的变量称为局部变量
定义变量可能有3中情况

  • 在函数的开头定义
  • 在函数内的复合语句内定义
  • 在函数外部定义
作用范围
  • 在一个函数内部定义的变量只在本函数范围内有效,在此函数以外是不能使用这个变量的
  • 在复合语句内定义的变量只在本复合语句内有效,在该复合语句以外是不能使用这个变量的
局部变量的存储方式和声明周期
存储方式 动态存储方式和静态存储方式
生命周期 自动变量(auto变量)
  • 函数中的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间,数据存储在动态存储区。
  • 在调用函数时,系统会给这些变量分配存储空间,在函数调用结束时就会自动释放这些存储空间
静态局部变量(static变量)
  • 有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用的时候该变量已经有值。这时就应该指定该局部变量为静态局部变量,用关键字static进行声明。
  • 静载局部变量属于静态存储类别。在程序整个运行期间都不释放。(而动态局部变量auto变量函数调用结束后即释放)
  • 对静态局部变量是编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而是保留上次函数调用结束时的值。而对于自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次函数重新给一次初值。
  • 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或'\0'(对字符变量)。而对自动变量来说,它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的内容是不可知的
  • 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。因为他是局部变量,只能被本函数引用,而不能被其他函数引用。
寄存器变量(register变量) 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器运算,如果需要存数,再从运算器将数据送到内存存放
如果一些变量使用频繁,则存取变量的值要花费不少时间。为提高执行效率,允许将局部变量的值存放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫寄存器变量用关键字register声明
全局变量 定义
在函数之外定义的变量称为外部变量也叫全局变量
作用范围
全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束
全局变量的存储类别
在一个文件内扩展外部变量的作用于 用extern对该变量做外部变量声明
在外部变量的作用域扩展到其他文件 将外部变量的作用域限制在本文件中 有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明
用static声明一个变量的作用是
  • 1 对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在
  • 对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)

    推荐阅读