在C语言中,static是一个关键字,具有很多重要的用途,本文将对其进行详细介绍。
static关键字是用来修饰变量和函数的
- 修饰局部变量称为静态局部变量
- 修饰全局变量称为静态全局变量
- 修饰函数称为静态函数
静态变量
在C语言中,使用static关键字定义的局部变量属于静态变量,也称为内部链接变量。这些变量仅在定义它们的函数或文件中可见,不能被其他文件访问。静态变量的生命周期与程序相同,并且只会被初始化一次。静态变量通常用于在函数之间传递数据或保存在函数调用之间保留下来的数据。
上述代码中,a是一个静态局部变量,自从第一次调用函数a被初始化,以后每次调用函数都不会在初始化a,因为a在函数调用完后不会被销毁,而是会保留数据进行下一次函数调用,从而实现在函数之间传递数据或保存在函数调用之间保留下来的数据。
本质上是:在编译环节的编译阶段编译器就会为被 static 修饰的局部变量分配空间,所以C程序在运行的过程中会直接跳过 static 修饰的语句,也就是说,在第二次及以上甚至第一次调用 test 函数时 static int a = 0; 这条语句都不会被执行。
静态函数
在C语言中,使用static关键字定义的函数属于静态函数,也称为内部链接函数。这些函数仅在定义它们的文件中可见,不能被其他文件调用。静态函数通常用于使代码更加模块化和安全。
没有static修饰的函数在同一项目不同源文件中可见,可以被调用。
static关键字定义的函数属于静态函数,这些函数仅在定义它们的文件中可见,不能被其他文件调用。
静态全局变量
在C语言中,使用static关键字定义的全局变量叫静态全局变量,也称为内部链接全局变量。这些变量与静态变量类似,但它们的作用域是整个文件,而不是函数。静态全局变量的值只会被初始化一次,并且只能在定义它们的文件中访问。
没有static修饰的全局变量的作用域是整个项目,具有外部链接属性,但在不同源文件使用需要用关键字extern声明变量。
static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了,感觉像是作用域变小了。
内存分布
内存大致可以分为三个区域:栈区,堆区和静态区,各区所存储的变量如下图所示。
注意:这只是一种粗略,简单的划分。
局部变量分配在栈区,全局变量分配在静态区。
总结
1、 全局变量和函数是可以跨文件访问的,因为有一定规模的项目,一定是多文件的,多个文件之间,后续一定要进行数据“交互” ,如果不能跨文件访问,数据"交互"成本会非常高,所以C语言在设计的时候就规定了全局变量和函数可以跨文件访问(全局变量需要extern关键字声明)
2、 static 修饰局部变量的作用:改变局部变量的生命周期,本质上是改变了局部变量的存储位置,让局部变量不再是在栈区上开辟空间,而是直接在静态区上开辟空间,从而使得局部变量拥有和全局变量一样的生命周期,即随着整个程序生成和销毁。
3、static 修饰全局变量的作用:**改变了全局变量的外部链接属性(**可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。
4、static 修饰函数的作用是:改变了函数的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。