全局变量与局部变量的区别7

本文详细介绍了程序设计中变量的分类,包括全局变量、静态全局变量、静态局部变量及局部变量,并阐述了它们的存储区域与作用域。此外,还深入探讨了变量的存储类型及其对程序的影响。

1.变量分类

1.1  变量可以分为:全局变量、静态全局变量、静态局部变量和局部量。 

1.2  按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。  

 

1.3  按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。


2.变量的作用域

按作用域范围可分为两种, 即局部变量和全局变量。 

2.1局部变量 

  局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。

关于局部变量的作用域还要说明以下几点: 

  1. 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。 

  2. 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。 

  3. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。

2.2全局变量 

  全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

2.3静态全局变量

静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。  

从分配内存空间看: 

全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。  

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。  

1) 静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 

2) 变量用static告知编译器,自己仅仅在变量的作用范围内可见。

这一点是它与全局变量的区别。 

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

3.变量的存储类型

变量的存储类型各种变量的作用域不同, 就其本质来说是因变量的存储类型相同。所谓存储类型是指变量占用内存空间的方式, 也称为存储方式。变量的存储方式可分为“静态存储”和“动态存储”两种。  

  3.1 静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。全局变量即属于此类存储方式。

3.2 动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。

从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。  

<think>嗯,用户想了解全局变量局部变量区别。我先回忆一下自己学过的知识。全局变量是在整个程序中都有效的变量,而局部变量只在特定的函数或块内有效。那它们的存储位置有什么不同呢?记得全局变量在静态存储区,局部变量在栈区。生命周期方面,全局变量从程序开始到结束都存在,局部变量则随着函数的调用而创建,结束后销毁。作用域的话,全局变量可以被所有函数访问,局部变量只能在定义它的函数里使用。 对了,用户提供的引用里提到C语言中全局变量首字母大写,这可能是一个命名习惯。还有shell的环境变量全局变量区别,不过用户的问题比较偏向一般编程概念,可能不需要深入shell的例子。需要确认不同编程语言中的实现是否一致,比如Python或Java中的情况,但用户可能只需要基础的区别。 另外,用户可能想知道为什么有时候用全局变量不好,比如耦合度高,难以维护。而局部变量有助于封装,减少冲突。可能还需要提到内存管理的问题,全局变量一直占用内存,局部变量则临时分配。 还要考虑例子是否清晰。比如在C语言中,函数内部定义的变量是局部的,外部无法访问。而全局变量在函数外定义,所有函数都可以使用。可能还要对比静态局部变量,不过用户的问题可能不需要涉及静态变量,但引用里有提到,可能需要简要说明。 用户可能还关心使用场景,什么时候用全局变量合适,什么时候应该避免。比如配置参数可能用全局变量,而临时计算用局部变量。但过度使用全局变量会导致代码难以调试维护。 需要确保回答结构清晰,分点说明,可能分为作用域、生命周期、存储位置、命名习惯、优缺点等方面。同时引用提供的资料,比如引用[1]提到局部全局变量容易被初学者忽视,引用[2][4]关于作用域命名习惯,引用[3]关于shell的例子,但可能只提到其他语言的情况。 最后生成相关问题,帮助用户进一步学习,比如优缺点、内存影响、静态变量对比等。确保问题覆盖用户可能感兴趣的扩展内容。</think>### 全局变量 vs 局部变量 区别详解 #### 1. **作用域** - **全局变量**:在整个程序或文件中有效,可被多个函数访问。例如在C语言中,定义在函数外的变量全局变量: ```c int GlobalVar = 10; // 全局变量 void func() { printf("%d", GlobalVar); // 可访问 } ``` 引用中提到:全局变量具有文件作用域,部分语言支持跨文件访问(需通过`extern`声明)[^2][^4]。 - **局部变量**:仅在定义它的函数或代码块内有效。例如: ```c void func() { int localVar = 5; // 局部变量 printf("%d", localVar); } ``` 其他函数无法直接访问`localVar`[^1]。 --- #### 2. **生命周期** - **全局变量**:从程序启动到结束一直存在,存储在静态内存区。 - **局部变量**:随函数调用而创建,函数结束时销毁,存储在栈区。例如: ```python def example(): x = 10 # 局部变量,函数结束后释放 ``` --- #### 3. **存储位置** - **全局变量**:静态存储区(编译时分配内存)。 - **局部变量**:栈区(运行时动态分配)。 --- #### 4. **命名习惯** - 在C语言中,**全局变量通常首字母大写**以区分局部变量,如`Max``Min`。 - 局部变量常用小写,如`temp`或`count`。 --- #### 5. **优缺点对比** | **特性** | 全局变量 | 局部变量 | |----------------|------------------------------|----------------------------| | 可维护性 | 耦合度高,易被意外修改 | 封装性好,减少冲突 | | 内存占用 | 长期占用内存 | 随函数结束释放 | | 适用场景 | 跨函数共享数据(如配置参数) | 临时计算或内部逻辑 | --- #### 6. **实际代码示例** ```c #include <stdio.h> int Global = 100; // 全局变量 void test() { int local = 50; // 局部变量 printf("Global: %d, Local: %d\n", Global, local); } int main() { test(); // printf("%d", local); // 错误:局部变量不可访问 return 0; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值