静态变量和动态变量 全局和局部

静态与动态存储
本文介绍了静态存储与动态存储的区别,包括变量的存储方式、生命周期、初始化特性及作用域等内容。静态存储变量在整个程序运行期间都存在,而动态存储变量则在使用时分配内存并在使用后释放。

静态存储与动态存储
1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储

2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放

3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期

4)静态存储只会初始化一次

静态局部变量与动态局部变量的主要不同:

两者作用域相同,都在函数内部,但是两者生命周期不一样,静态局部变量的生命周期是到程序的结束,而动态局部变量的生命周期是函数的结束,静态局部变量的生命周期更长,同时静态局部变量只会初始化一次,函数重复调用,但静态局部变量不会被重新初始化

5)作用域

作用域小的掩盖作用域大的,所以局部变量会掩盖全局变量。所以动态局部变量a会掩盖了静态全局变量a

### 全局变量局部变量静态变量区别及用法 #### 1. 全局变量 全局变量是在函数外部定义的变量,其作用域覆盖整个源文件。一旦定义了全局变量,它在整个程序运行期间都存在,并且可以在任何函数中访问[^4]。 - **存储方式**:全局变量默认是静态存储方式,意味着它的内存分配在程序启动时完成,并在程序结束时释放。 - **作用域**:全局变量的作用域是从定义处到源文件的末尾。如果需要限制其作用域,可以使用`static`关键字将其声明为静态全局变量,此时该变量只能在定义它的源文件内使用[^2]。 示例代码: ```c #include <stdio.h> int globalVar = 10; // 全局变量 void func() { printf("Global variable: %d\n", globalVar); } int main() { func(); return 0; } ``` #### 2. 局部变量 局部变量是在函数或代码块内部定义的变量,其作用域仅限于定义它的代码块。局部变量在进入代码块时分配内存,在退出代码块时释放内存[^4]。 - **存储方式**:局部变量默认是自动存储方式(`auto`),即每次调用函数时都会重新分配内存。 - **作用域**:局部变量的作用域仅限于定义它的函数或代码块。 示例代码: ```c #include <stdio.h> void func() { int localVar = 5; // 局部变量 printf("Local variable: %d\n", localVar); } int main() { func(); return 0; } ``` #### 3. 静态变量 静态变量是一种特殊的变量,可以通过`static`关键字定义。根据定义位置的不同,静态变量分为静态局部变量静态全局变量。 ##### (1) 静态局部变量 静态局部变量是在函数内部定义并使用`static`修饰的变量。与普通局部变量不同,静态局部变量的生存期贯穿整个程序运行期间,但作用域仍然局限于定义它的函数[^3]。 - **存储方式**:静态局部变量的内存分配在程序启动时完成,并在程序结束时释放。 - **初始化**:静态局部变量只会初始化一次,后续调用时保留上次的值。 - **作用域**:静态局部变量的作用域仅限于定义它的函数。 示例代码: ```c #include <stdio.h> void func() { static int staticVar = 0; // 静态局部变量 staticVar++; printf("Static local variable: %d\n", staticVar); } int main() { func(); // 输出 1 func(); // 输出 2 return 0; } ``` ##### (2) 静态全局变量 静态全局变量是通过`static`关键字定义的全局变量。与普通全局变量不同,静态全局变量的作用域被限制在定义它的源文件内,无法被其他源文件访问[^2]。 - **存储方式**:静态全局变量的存储方式与普通全局变量相同,都是静态存储。 - **作用域**:静态全局变量的作用域仅限于定义它的源文件。 示例代码: ```c // 文件1.c static int staticGlobalVar = 10; // 静态全局变量 void printStaticGlobal() { printf("Static global variable: %d\n", staticGlobalVar); } // 文件2.c // 尝试访问 staticGlobalVar 将导致编译错误 ``` ### 总结 - **全局变量**:作用域覆盖整个源文件,生存期贯穿整个程序运行期间。 - **局部变量**:作用域仅限于定义它的代码块,生存期从进入代码块开始到退出代码块结束。 - **静态变量**:包括静态局部变量静态全局变量,具有不同的作用域生存期特性。静态局部变量的作用域限于定义它的函数,而静态全局变量的作用域限于定义它的源文件。 ### 注意事项 - 使用全局变量时需谨慎,因为它可能导致意外的副作用,尤其是在复杂的程序中。 - 静态局部变量适合用于需要在多次函数调用之间保留值的场景,而静态全局变量则适合用于限制变量的作用域以避免命名冲突。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值