静态变量static和全局变量global

本文详细解释了静态变量和全局变量的概念及它们之间的区别。静态变量属于类而非实例,存储在静态存储区,可通过类名访问。全局变量在整个工程文件内有效,而静态全局变量仅在定义文件内有效。

静态变量static , 全局变量global

静态变量 在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了内存空间,他是属于类的也就是没个实例对象都是对于以个静态变量,静态变量的内存空间知道程序退出才释放所占用的内存空间。静态变量直接通过类名访问(java 也能通过对象名访问)。

 有人会分全局的静态变量、局部的静态变量;全局静态变量失去了“全局”的普遍含义,它的作用域限定在本文件里。而静态变量的声明是应该出现在类里不是类的函数里。

 

全局变量 关键字global也是静态存储方式,存储在静态存储区。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

 

 

全局变量和静态变量的区别

 全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

 

 也能这么看:

 A.若全局变量仅在单个文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

 B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题:

 D.如果我们需要一个可重入的函数,那么我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的函数)

 E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

 

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

 

变量的6种作用:全局作用域,文件作用域,命名空间作用域,类作用域,局部作用域,语句作用域。

### 静态变量的定义与特点 在 C 语言中,静态变量是通过 `static` 关键字修饰的变量,分为全局静态变量局部静态变量静态变量的生命周期作用域与普通变量有所不同,其存储位置在数据段中,而非栈上。全局静态变量的作用域仅限于定义它的源文件,无法被其他文件访问,这有助于限制变量的可见性,提升代码的封装性与安全性[^1]。 局部静态变量具有局部作用域,仅在其定义的函数内可见,但其生命周期贯穿整个程序运行周期。与普通局部变量不同,局部静态变量只在第一次执行到定义语句时初始化一次,之后函数调用时不会重新初始化。例如: ```c void func(void) { static int count = 0; count++; printf("%d\n", count); } ``` 上述代码中,`count` 是一个静态局部变量,每次调用 `func()` 时,`count` 的值都会递增,而不会在函数返回后被销毁[^4]。 --- ### 全局变量的定义与特点 全局变量是在函数外部定义的变量,具有全局作用域静态存储期。全局变量在整个程序运行期间都存在,且默认情况下可在所有源文件中访问(除非被 `static` 修饰限制作用域)。全局变量的初始化发生在程序启动时,其生命周期与程序一致。 例如: ```c int global_var = 10; // 全局变量 void func(void) { global_var += 5; } ``` 在多个源文件中使用全局变量时,未定义该变量的文件需要使用 `extern` 关键字进行声明,以告知编译器该变量的定义在其他文件中[^2]。 --- ### 静态变量全局变量区别 | 特性 | 静态变量 | 全局变量 | |------------------|--------------------------------------|--------------------------------------| | 作用域 | 仅限于定义它的文件或函数 | 整个程序,所有源文件可见 | | 生命周期 | 程序运行期间始终存在 | 程序运行期间始终存在 | | 存储位置 | 数据段 | 数据段 | | 初始化次数 | 仅初始化一次 | 仅初始化一次 | | 可见性控制 | 通过 `static` 可限制作用域 | 默认全局可见,需 `extern` 声明 | | 使用场景 | 限制变量作用域,提升模块化程度 | 多模块共享数据 | 全局变量在整个程序中都可见,适用于多个函数或模块之间共享数据。静态变量则更适用于模块内部使用,避免命名冲突并增强封装性。例如,在一个函数中定义的静态变量只能被该函数访问,而一个文件作用域的静态变量只能在当前文件中使用[^4]。 --- ### 示例对比 以下代码展示了全局变量与静态局部变量的行为差异: ```c #include <stdio.h> int global_var = 0; // 全局变量 void func_static(void) { static int static_var = 0; static_var++; printf("Static variable: %d\n", static_var); } void func_global(void) { global_var++; printf("Global variable: %d\n", global_var); } int main(void) { func_static(); // 输出 1 func_static(); // 输出 2 func_global(); // 输出 1 func_global(); // 输出 2 return 0; } ``` 在上述代码中,`static_var` 每次调用 `func_static` 时递增,而 `global_var` 在多个函数调用中也递增,但其作用域更广[^3]。 --- ### 总结 静态变量全局变量在生命周期、作用域使用场景上有显著区别静态变量更适合于模块内部状态的维护,而全局变量适用于多个模块间共享数据。合理使用 `static` 关键字可以提升代码的可维护性安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值