自动变量、静态变量的持续性、区域性、和链接性

文章主要介绍变量的持续性、区域性和链接性。自动变量在函数内定义,区域性在函数内,无链接性,函数执行时创建,结束后销毁;静态变量分配固定内存,持续性为程序运行周期;全局变量工程内所有文件可访问,使用需extern声明,也可用static限制链接性。

声明: 这篇文章可以不经过作者的同意任意转载,但请保留作者及出处,谢谢。

作者:closeall

     这里我想写一下变量的持续性、区域性、和链接性。先简单的介绍一下这三个属性是什么意思。所谓持续性

就是说这个变量所持续的时间,即它在内存中存在的时间。区域性简单的说就是变量的作用域,就是说这个变量

在哪个范围内有效的。链接性是说,这个变量是不是允许外部文件使用。先说自动变量。什么是自动变量呢 ?

自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方

都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没

有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,

所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为

他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算

机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通

过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。静态变量:静态变量与自动变

量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在

程序运行的整个过程中,它都会被保持,而不会不销毁。这就是说静态变量的持续性是程序运行的整个周期。这

有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内

部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就会别销毁,而静态变量不会被销毁。他在函

数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的所有文件都可以访问他,但是它在

整个工程内只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,必须用

extern来声明这个变量,这个声明叫做引用声明。这一点很重要,如过你没有用extern 来声明在其他文件中已经

定义的全局变量,就来使用它,就会发生错误如果你只是想在定义他的文件中使用它,而不允许在其他的文件中

使用它,那么就用关键字static来在函数外面声明变量。这样这个变量在其他文件中将不可见,即它的连接性而

内部链接。有一点是我们只得注意的像:如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部

链接,只能在定义他的文件内使用。还有如果你在定义静态变量的时候并没有给变量初始化,则静态变量将被自

动初始化为0;

就简单的说这些了。

  作者:closeall

 

<think>我们首先需要解释全局变量静态变量的概念,然后通过代码示例展示它们的区别。 全局变量:定义在函数外部的变量,整个文件(甚至其他文件通过extern)可见。 静态变量:分为静态全局变量(在文件作用域内使用static修饰)静态局部变量(在函数内部使用static修饰)。 静态全局变量:只在定义它的文件内可见,其他文件无法访问。 静态局部变量:在函数内部定义,但生命周期是整个程序运行期间,且只在定义它的函数内可见。 下面通过代码举例说明: 假设有两个文件:file1.c file2.c 在file1.c中: */ // 全局变量 int global_var = 10; // 静态全局变量 static int static_global_var = 20; void func() { // 静态局部变量 static int static_local_var = 30; static_local_var++; printf("static_local_var in func: %d\n", static_local_var); } int main() { // 可以访问global_varstatic_global_var printf("global_var: %d\n", global_var); printf("static_global_var: %d\n", static_global_var); func(); // 输出31 func(); // 输出32 return 0; } /* 在file2.c中: */ // 声明来自file1.c的全局变量 extern int global_var; // 但是无法访问file1.c中的静态全局变量,下面的声明是错误的: // extern int static_global_var; // 链接错误 void another_func() { // 可以访问global_var printf("global_var in another_func: %d\n", global_var); // 不能访问file1.c中的static_global_varstatic_local_var } // 另外,静态局部变量只能在定义它的函数内访问,所以file2.c中也不能访问func中的static_local_var。 /* 区别总结: 1. 作用域: - 全局变量:整个程序(多个文件)可见(通过extern声明) - 静态全局变量:仅在定义它的文件内可见 - 静态局部变量:仅在定义它的函数内可见 2. 生命周期: - 全局变量静态变量(无论全局还是局部)的生命周期都是整个程序运行期间。 - 而普通局部变量在函数调用结束后就销毁了。 注意:静态局部变量虽然生命周期是全局的,但作用域仅限于函数内部,因此它结合了全局变量(生命周期)局部变量(作用域)的特点。 另一个重要区别:初始化 - 全局变量静态变量(包括静态全局静态局部)如果没有显式初始化,会被自动初始化为0(或空针)。 - 普通局部变量如果不初始化,其值是未定义的(垃圾值)。 下面再举一个静态局部变量的例子: */ #include <stdio.h> void count() { static int counter = 0; // 只初始化一次,函数退出后值保留 counter++; printf("Counter: %d\n", counter); } int main() { count(); // 输出1 count(); // 输出2 count(); // 输出3 return 0; } /* 在这个例子中,静态局部变量counter在每次调用count函数时都会保留上一次的值。 */ §§相关问题§§ 1. 为什么静态局部变量的初始化只执行一次? 2. 全局变量静态变量在内存的哪个区域分配? 3. 在多文件程序中,如何限制全局变量只被一个文件访问? 4. 静态局部变量与普通全局变量相比有什么优势? 5. 在C++中,静态成员变量与普通全局变量有何异同?</think>### 全局变量静态变量详解(含代码示例) #### 1. **全局变量** - **定义**:在函数外部声明的变量,整个程序可见 - **生命周期**:程序启动时创建,程序结束时销毁 - **存储位置**:数据段(全局区) - **默认初始化**:自动初始化为0或NULL ```c #include <stdio.h> int global_count = 0; // 全局变量 void increment() { global_count++; } int main() { printf("初始值: %d\n", global_count); // 输出0 increment(); increment(); printf("调用后: %d\n", global_count); // 输出2 return 0; } ``` #### 2. **静态变量** - **静态局部变量**(函数内部) - 作用域:仅在声明它的函数内可见 - 生命周期:程序运行期间持续存在 - **关键特**:保留上次函数调用结束时的值 ```c #include <stdio.h> void counter() { static int static_count = 0; // 静态局部变量 static_count++; printf("静态计数: %d\n", static_count); } int main() { counter(); // 输出1 counter(); // 输出2 counter(); // 输出3 return 0; } ``` - **静态全局变量**(文件作用域) - 作用域:仅在定义它的源文件内可见 - 作用:避免命名冲突 ```c // file1.c static int file_private = 42; // 静态全局变量(仅本文件可见) // file2.c extern int file_private; // 链接错误!无法访问其他文件的静态全局变量 ``` ### 核心区别总结 | 特 | 全局变量 | 静态局部变量 | 静态全局变量 | |--------------|------------------------|----------------------|-------------------| | **作用域** | 整个程序 | 声明它的函数内部 | 定义它的源文件内 | | **可见** | 所有文件通过`extern`访问 | 仅函数内可见 | 仅本文件可见 | | **生命周期** | 程序运行期 | 程序运行期 | 程序运行期 | | **初始化** | 自动归零 | 首次初始化,后续保留值 | 自动归零 | | **主要用途** | 跨文件共享数据 | 函数调用间保持状态 | 文件内私有数据 | ### 关键区别演示 ```c #include <stdio.h> int global_var; // 全局变量自动初始化为0) static int static_global; // 静态全局变量 void demo() { int local_var = 0; // 普通局部变量 static int static_local = 0; // 静态局部变量 printf("普通局部: %d | 静态局部: %d\n", local_var++, static_local++); } int main() { // 全局变量可跨文件访问(需extern声明) extern int global_var; // 静态全局变量仅本文件可见 printf("静态全局: %d\n", static_global); // 测试函数调用 demo(); // 输出: 普通局部: 0 | 静态局部: 0 demo(); // 输出: 普通局部: 0 | 静态局部: 1 demo(); // 输出: 普通局部: 0 | 静态局部: 2 return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值