静态变量和外部变量

static和extern是两种可以全局作用的变量。

在这里,先说明“声明”和“定义”的区别。如果是定义,那么编译器会为该分量分配内存空间,但是对于声明来说则不会分配。

静态变量的定义是伴随着声明的,也就是说不管在声明的时候有没有对变量进行初始化,静态变量都会进行初始化,缺省值为0;然而外部变量的声明和定义是分开的,并且可以在多个文件中多次声明同一个变量(要注意,外部变量的定义一定要在函数体外进行)。

ps:当int a放在外部时,它表示的是外部变量而不是静态变量,并且会被默认初始化为0,同静态变量。若无extern,则表示该变量的定义,加了extern则仅仅是声明,不分配内存。

ps:外部和静态变量都只会被初始化一次,而自动变量和寄存器变量每次进入函数都会被重新初始化一次。

基本的区别也就这样,以下说明一下全局静态变量和局部静态变量。

对于局部静态变量,它的作用域在函数块内,块外不能访问,但是生命周期直到整个程序的结束(个人认为静态局部变量的好处在于避免了放在块外被不小心修改的可能)。而全局静态变量,它的作用域在于整个文件的结束,这里再提一下和extern的区别,extern在整个程序中都可以被访问,只要在所在的文件内重新声明即可使用,而全局静态变量只局限在自己的文件内。

### 动态变量静态变量外部变量的概念及用法 #### 动态变量 动态变量通常指的是在程序运行过程中按需分配内存的变量。这类变量一般通过 `auto` 或者堆内存分配来实现。 - **作用域**:动态变量通常是局部变量的一部分,默认情况下遵循局部变量的作用域规则,即仅在其定义所在的函数或代码块中有效。 - **生命周期**:当函数执行完毕后,动态变量所占用的栈内存会被释放[^3]。 - **存储位置**:动态变量主要存储在栈内存中,除非显式地使用堆内存(如通过 `malloc()` 或 `new` 进行动态分配)。 以下是动态变量的一个简单例子: ```c void example() { int dynamicVar = 10; // 默认为 auto 类型 printf("Dynamic Variable: %d\n", dynamicVar); } // 函数结束后,dynamicVar 被销毁 ``` --- #### 静态变量 静态变量是指在整个程序运行期间都保持存在并保留上次赋值的状态的一种特殊变量。它可以分为两种形式:静态局部变量静态全局变量。 - **静态局部变量** - **作用域**:局限于定义它的函数内部。 - **生命周期**:从程序启动到终止一直存在,即使函数多次调用也不会重新初始化[^3]。 - **存储位置**:位于静态存储区。 示例代码如下: ```c void counter() { static int count = 0; // 静态局部变量 count++; printf("Count: %d\n", count); } ``` - **静态全局变量** - **作用域**:限定于当前源文件内,无法被其他文件访问。 - **生命周期**:同样贯穿整个程序运行期。 - **存储位置**:也位于静态存储区。 示例代码如下: ```c static int globalStaticVar = 0; // 静态全局变量 ``` --- #### 外部变量 外部变量是一种可以在多个源文件之间共享的全局变量。为了使某个变量能够在另一个文件中可见,需要使用关键字 `extern` 来声明该变量的存在。 - **作用域**:从定义处开始直到本文件结束;如果希望跨文件使用,则需要在目标文件中通过 `extern` 关键字引入。 - **生命周期**:如同普通的全局变量一样,在整个程序运行期内持续存在。 - **存储位置**:与全局变量相同,均处于静态存储区。 下面是一个关于外部变量使用的案例: 假设有一个名为 `file1.c` 的文件中有这样的定义: ```c int externalVar = 42; ``` 而在另一份独立的文件 `file2.c` 中可以通过以下方法引用这个变量: ```c extern int externalVar; void printExternalVar() { printf("Value of External Var: %d\n", externalVar); } ``` --- ### 区别与联系总结表 | 特性/类别 | 动态变量 | 静态变量 | 外部变量 | |----------------|----------------------------------|-------------------------------------|------------------------------| | **作用域** | 局部 | 静态局部:局部<br>静态全局:单个文件内 | 全局 | | **生命周期** | 当前函数调用结束时销毁 | 整个程序运行期间 | 整个程序运行期间 | | **存储位置** | 栈 (默认)<br>或堆 (手动分配) | 静态存储区 | 静态存储区 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值