026day(全局,局部,静态变量和变量的作用域,生存期)

《2017年11月5日》【连续026天】

标题:全局,局部,静态变量和变量的作用域,生存期;

内容:A.观看MOOC10.2,10.3;

           B(a).局部变量:定义在函数内部的变量(包括函数的形参),全局变量:定义在函数外面的变量

全局变量在所有函数中均可使用,局部变量只能在定义它的函数内部使用;

全局变量都是静态变量。定义局部变量时,加“static”,该变量也成为静态变量;

静态变量的存放地址,在整个程序运行期间,都是固定不变的;

非静态变量(一定是局部变量)地址,在函数的一次执行期间不变,每次函数调用时都可能不同;

未明确初始化时,静态变量会被自动初始化成全0(每个bit都为0),非静态变量的值随机;

void Func()
{
static int n = 4; //静态变量只初始化一次
cout<<n<<endl;
++n; 
}
int main()
{
Func();Func();Func();

因为静态变量只输出一次,所以当第一次所以Func函数定义n后,以后的Func将不在定义n;

静态变量应用:

strtok的实现(strtok函数详见023day)

char *Strtok(char*p,char*sep)
{
static char*start;  //本次查找子串的起点 
if(p)   //如果p不为空指针,则是第一次调用Strtok ,故后续调用Strtok第一个实参必须是NULL 
    start=p;
    for(;*start&&strchr(sep,*start);++start);
if(*start==0)
         return NULL;
char *q=start;
for(;*start&&!strchr(sep,*start);++start);
if(*start){
*start=0;
++start;
}          
return q;   
}

  (b).标识符的作用域;变量名,函数名,类型名统称为“标识符”,一个标识符能起作用的范围叫作用域;

使用标识符的语句,必须出现在它们的声明或定义之后,且在作用域外使用该标识符,该标识符会没有定义;

单文件的程序中,结构,函数和全局变量的作用域是其定义的整个文件;

函数形参的作用域是整个函数;局部变量的作用域是从定义它的语句开始,到包含它的最内层”}“结束;

for循环里定义的循环控制变量,其作用域就是整个for循环;

同名标识符的作用域,当大的包含小的时,在小的作用域里,大的标识符被屏蔽,不起作用;

       变量的生存期:在此期间,变量占用内存空间,占用的内存空间只能归它使用,不会被用来存放其他东西;

全局变量的生存期:从程序被装入内存开始,到整个程序结束;

静态局部变量生存期:从定义它的语句第一次被执行,到整个程序结束;

函数形参的生存期:从函数执行开始,到函数返回时结束。

非静态局部变量:从执行到定义它的语句开始,到程序执行到它的作用域之外结束;

明日计划:学习选择排序和插入排序;

 

 

 

 

<think> 我们正在讨论全局变量全局静态变量(即静态全局变量)的区别。根据上述引用内容,我们可以总结如下: 1. **作用域**: - 全局变量作用域是整个程序(所有源文件)。在一个源文件中定义的全局变量,可以通过 `extern` 声明在其他源文件中使用。 - 静态全局变量作用域仅限于定义它的源文件。其他源文件无法访问,即使使用 `extern` 声明也不行。 2. **链接属性**: - 全局变量:具有外部链接(external linkage),即在链接时,不同源文件中的同名全局变量会被视为同一个变量(因此不能重名定义,否则链接错误)。 - 静态全局变量:具有内部链接(internal linkage),即在链接时,不同源文件中的同名静态全局变量被视为不同的变量(因此可以在不同源文件中定义同名的静态全局变量,互不影响)。 3. **存储方式生命周期**: - 两者相同:都存储在静态存储区(数据段或BSS段),生命周期都是从程序开始运行到程序结束。 4. **使用上的注意事项**: - 全局变量:不能在头文件中定义(因为头文件被多个源文件包含会导致重复定义),但可以在头文件中用 `extern` 声明,然后在某个源文件中定义。 - 静态全局变量:可以在头文件中定义(因为每个包含该头文件的源文件都会有自己的一个副本,互不干扰),但这样每个源文件都有一个独立的变量,不能实现数据共享。 5. **设计目的**: - 全局变量:用于在程序的所有源文件之间共享数据。 - 静态全局变量:用于限定变量作用域仅在当前源文件,避免在其他源文件中被意外修改,提高程序的模块化安全性。 举例说明: - 全局变量: ```c // file1.c int globalVar = 10; // 定义全局变量 // file2.c extern int globalVar; // 声明全局变量 void func() { globalVar = 20; // 可以访问并修改 } ``` - 静态全局变量: ```c // file1.c static int staticGlobalVar = 30; // 静态全局变量,只在file1.c中可见 // file2.c static int staticGlobalVar = 40; // 另一个静态全局变量,与file1.c中的无关 // 无法通过extern声明file1.c中的staticGlobalVar ``` 总结:全局变量静态全局变量的主要区别在于作用域链接属性。全局变量可以在整个程序中访问,而静态全局变量只在定义它的源文件中可见。静态全局变量通过限制作用域,可以避免命名冲突意外的外部访问,增强了封装性。 §§相关问题§§ 1. 全局变量静态全局变量的存储位置生命周期有什么区别? 2. 为什么静态全局变量可以避免在多文件程序中引起错误? 3. 在头文件中定义静态全局变量会导致什么问题? </think> ### 全局变量全局静态变量的区别 全局变量全局静态变量静态全局变量)在C/C++中都定义在函数外部,但存在以下关键差异: #### 1. 作用域(可见性) - **全局变量** 作用域是整个程序,可通过`extern`在其他源文件中访问: ```c // file1.c int globalVar = 10; // 全局变量 // file2.c extern int globalVar; // 声明后可访问 ``` - **全局静态变量** 作用域仅限于定义它的源文件,其他文件无法访问: ```c // file1.c static int staticGlobalVar = 20; // 静态全局变量 // file2.c extern int staticGlobalVar; // 错误!无法访问 ``` 静态全局变量通过限制作用域避免多文件命名冲突[^1][^2]。 #### 2. 链接属性 - **全局变量** 具有**外部链接**(external linkage): 所有源文件中的同名全局变量指向同一内存地址,重复定义会导致链接错误。 - **全局静态变量** 具有**内部链接**(internal linkage): 不同源文件中的同名静态全局变量是独立实体,互不影响[^2]。 #### 3. 头文件中的行为 - **全局变量** 不能在头文件中定义(否则多文件包含会导致重定义错误),只能在头文件中声明: ```c // globals.h extern int globalVar; // ✔️ 声明 // globals.c int globalVar = 10; // ✔️ 定义 ``` - **全局静态变量** 可在头文件中定义,每个包含该头文件的源文件会创建独立副本: ```c // config.h static int configValue = 42; // ✔️ 每个源文件独立副本 ``` #### 4. 内存与生命周期 | 特性 | 全局变量 | 全局静态变量 | |--------------|---------------|----------------| | **存储位置** | 静态存储区 | 静态存储区 | | **生命周期** | 程序整个运行期 | 程序整个运行期 | | **初始化** | 未初始化时在BSS段 | 同左 | > 两者生命周期相同,但作用域链接属性不同[^1][^4]。 #### 5. 使用场景对比 - **全局变量适用场景**: 需要在多个源文件间共享数据时(如跨模块配置参数)。 - **全局静态变量适用场景**: 需要文件内私有数据时(如隐藏实现细节,避免外部访问)[^1][^2]。 #### 示例代码 ```c // file1.c int globalVar = 10; // 全局变量 static int staticGlobalVar = 20; // 静态全局变量 void printVars() { printf("File1: %d, %d\n", globalVar, staticGlobalVar); } // file2.c extern int globalVar; // ✔️ 声明全局变量 void modifyVars() { globalVar = 100; // ✔️ 修改成功 // staticGlobalVar = 200; // ❌ 编译错误(不可见) } ``` ### 关键总结 | 特性 | 全局变量 | 全局静态变量 | |--------------|------------------------|-------------------------| | **作用域** | 整个程序 | 单个源文件 | | **链接属性** | 外部链接 | 内部链接 | | **跨文件访问** | 通过`extern`声明 | 不可访问 | | **重名处理** | 禁止重名(链接错误) | 允许不同文件重名 | | **封装性** | 低(全局暴露) | 高(文件内私有) | > 静态全局变量通过限制作用域增强了模块化设计,减少了命名冲突风险[^1][^2][^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值