static全局变量和static函数的比较,以及static全局变量与static局部变量的比较

一、static全局变量和static函数的比较

1.static修饰的全局变量和函数均限定了其作用域,仅在定义它的源文件中。

2.而对于非static全局变量和函数,其作用域覆盖了整个源程序!(注意!一个源程序可能由多个源文件组成),若想在非定义该全局变量/函数的源文件中调用它:

  • 全局变量可以直接用,因为全局变量默认有extern关键字修饰
  • 而函数必须:方法1:第一步,在一个头文件中声明这个函数;第二步,令这个源文件包含该头文件。或者方法2:直接在调用该函数前声明这个函数。

此外,static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

二、static全局变量与static局部变量的比较

1.对于全局变量,由上可知,static没有修改其的存储位置/生命周期(仍然是存储在全局数据区,静态存储方式),只修改了其作用域(非static全局变量作用域为整个源程序,static全局变量作用域仅限于当前源文件)

2.对于局部变量,static没有修改其作用域(仍然是定义它们之后、花括号以内),只修改了其存储位置/生命周期(非static局部变量存储在栈区,static局部变量存储在全局数据区)

总而言之,局部变量改变为static后是改变了其存储方式(即改变了其生存期),全局变量改变为static后是改变了其作用域(即限制了它的使用范围)

此外,static局部变量只被初始化一次,下一次依据上一次结果值。