-
2019-11-26 17:53:17
区分静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)
静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)
文章参考:https://blog.csdn.net/21aspnet/article/details/2560072
文章参考:https://blog.csdn.net/u013921430/article/details/79279114变量的分类来看
变量分类
- 作用域分类
局部变量(默认是自动局部变量)
1. 定义:在一个函数内部定义的变量(包括函数形参)
2. 有效范围:一直在本函数有效
3. 变量存储:栈内存,函数结束之后自动销毁
4. 静态局部变量:存储在静态存储区,作用域依旧在函数体内部。每次对其修改都会被保存下来。
** 全局变量 **
1. 定义:在函数外部定义的变量,可为本源文件中其他函数使用
2. 有效范围:从定义变量的位置开始到本源文件的结束
3. 变量存储:存储在静态存储区域(静态内存)
4. 可被工程项目其他文件的 extern 声明之后调用,对其每次修改都会进行保存
5. 静态全局变量:不能被其他源文件使用,只能本源文件使用,并且每次修改会被保存 - 生存周期分类
静态存储方式——程序运行期间分配固定的存储空间的方式
动态存储方式——程序运行期间根据需要进行的动态分配空间的方式
又可分为
1. auto(自动)——默认,数据存储在动态存储
2. static(静态)——函数在调用结束之后会保存本次调用的数值
3. register(寄存器)——在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
4. extern (外部)——扩展全局变量的作用域
更多相关内容 - 作用域分类
-
C语言的局部变量和外部变量
2015-08-14 06:03:04在函数体或复合语句中声明的变量为局部变量。函数中的形式变量也是局部变量。在所有函数体外定义的变量称为外部变量(或全局变量)。在函数体或复合语句中声明的变量为局部变量。函数中的形式变量也是局部变量。在所有函数体外定义的变量称为外部变量(或全局变量)。
局部变量
局部变量具有以下性质:
- 自动存储期限。变量的存储期限是指从变量开始占用存储单元到存储单元被回收之间的程序。程序执行时,在函数体或复合语句中变量定义处,为变量自动分配存储单元,到函数返回(或复合语句结束)时,收回分配的存储单元。
- 程序块作用域。变量的作用域是可以访问或引用变量的代码段。局部变量的作用域是从函数或复合语句的变量声明部分开始,到函数返回或复合语句结束时止。由于局部变量对于函数(或复合语句)外的代码不可见,因此可以在那里使用相同的变量名。当同名的两个变量位于内外层且外层变量处于内层变量声明前时,进入内层变量声明时,“暂时”隐藏外层变量的声明,使得变量名称标识符表示内层变量,在内层程序块结束时恢复变量名称标识符表示外层变量。
/*************************************** * local_variable.c * * * * C语言中的局部变量 * ***************************************/ #include <stdio.h> int hisLog2(int n) { /*局部变量*/ int log = 0; /*形式变量n也是函数内的局部变量*/ while (n > 1) { n /= 2; log++; } return log; } int main() { /*局部变量*/ unsigned int n = 1; printf("输入一个正整数: "); scanf("%u", &n); printf("log2(%u) = %d", n, hisLog2(n)); return 0; }
带有
static
定义的变量具有静态存储期限,在程序执行期间永久地占用存储单元,在函数返回或复合语句结束时不丢失原有的值。然而它还是只有程序块作用域,对函数或复合语句外代码具有不可见性。/************************************** * static_local_variable.c * * * * C语言中的静态局部变量 * **************************************/ #include <stdio.h> void addA() { static int a = 0; a++; printf("a = %d\n", a); } int main() { int i = 0; for(i = 0; i < 10; i++) { static int b = 0; printf("b = %d,", ++b); addA(); } return 0; }
外部变量
外部变量具有以下性质:
- 静态存储期限。
- 文件作用域。从变量声明的点开始,一直到闭合文件的结尾。当使用
#include
包含一个外部变量的文件时,外部变量的作用域扩展到该文件末尾。
外部变量使得程序的耦合性增强,修改外部变量会影响程序的其他部分,难以维护和重用。
/************************************** * another_file.c * * * * 定义全局变量的某个文件 * **************************************/ int a = 0; /************************************** * global_variable.c * * * * C语言中的全局变量 * **************************************/ #include <stdio.h> #include "another_file.c" int b = 0; void addB() { b += 2; } void setA(int n) { a = n; } int main() { setA(10); printf("Now A is %d\n", a); addB(); printf("Now B is %d\n", b); return 0; }
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社
-
Android中的全局变量与局部变量使用小结
2021-01-04 21:23:37也称为外部变量。局部变量则是特定过程或函数中可以访问的变量。声明一个变量是很 容易的,但是讲到使用的时候,却不是想象的那样简单。至于本人则是经常定义全局变量使用,但也就是因为这样,定义的是全局变量。也... -
局部变量,全局变量(外部变量),静态局部变量,静态全局变量
2018-03-20 16:59:43今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...今天被问到了一个问题:如何让请求的类延迟释放
如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。
单例的写法如下:
+ (instancetype)sharedInstance
{
static AFNetworkingTool *_afNetWorkingTool = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//code to be executed once
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
_afNetWorkingTool = [[AFNetworkingTool alloc] initWithSessionConfiguration:configuration];
});
return _afNetWorkingTool;
}
静态变量写法:
+ (instancetype)sharedInstance
{
static AFNetworkingTool *_afNetWorkingTool = nil;
if (!_afNetWorkingTool) {
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
_afNetWorkingTool = [[AFNetworkingTool alloc] initWithSessionConfiguration:configuration];
}
return _afNetWorkingTool;
}
这两种方法还是有些区别的,我最后选择了定义一个静态局部变量的方法。后面我会说明为什么没有选择单例。
其中AFNetworkingTool 继承自AFURLSessionManager。可以看到,把AFNetworkingTool的实例对象定义成了一个静态局部变量,这样作为静态变量,它的生命周期是整个程序。免去了每次请求都要创建的情况,直到应用结束才会释放分配的内存,避免由于频繁的请求,导致频繁的内存请求和释放。
这次文章分享主要想聊一下常用的几种变量:局部变量,全局变量/外部变量,静态局部变量,静态全局变量。
局部变量:{}内定义的变量可以称之为局部变量,作用域在调用函数,内存存储方式为动态存储,生命周期在调用函数运行周期,函数结束后释放内存。
全局变量(外部变量):{}外定义的变量称之为全局变量(外部变量)。作用域在整个项目,不光当前文件可用,其他文件也可以用。内存存储方式为静态存储方式,生命周期在整个应用程序。
静态局部变量:局部变量前面加上static关键字,称之为静态局部变量。它的作用域和局部变量一样,在调用函数,只不过生命周期在整个应用程序。内存存储方式为静态存储。
静态全局变量:全局变量声明前加上static关键字,称之为静态全局变量。它的作用域在当前文件,其他文件不可引用。存储方式为静态存储,生命周期在整个应用程序。
总结:
- 局部变量和(外部)全局变量很容易理解,作用域和生命周期不同。static关键字用在不同的变量,作用也不一样。作用在局部变量,可以改变其生命周期,延长至整个应用程序结束。如果作用在全局变量,可以改变其作用域,只限于当前文件引用,其他文件不能引用。
- 静态存储和动态存储:静态存储是在编译期分配内存,应用程序结束后释放内存,内存地址在静态区,由系统统一分配和释放。动态存储在运行期分配内存,调用函数结束后释放。变量内存地址在堆中,由程序员管理和释放(ARC下自动插入分配和释放代码),例如alloc分配的内存。
- 静态存储的变量如果在声明的时候没有初始化,会根据数据类型自动将其初始化为0或者null等。动态存储的变量如果在声明的时候没有初始化,那么它的值是不确定的,因为类型不确定,这是由动态语言决定的。
-
内部变量和外部变量就是局部变量和全局变量吗?
2016-03-07 02:45:54局部变量和全局变量是从作用域...为什么很多地方就默认为内部变量和外部变量就是局部变量和全局变量 这样子的话那么这句话怎么理解呢? -
PHP变量作用域(全局变量&局部变量)&global&static关键字用法实例分析
2020-12-20 05:53:29本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法。分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容器。关于它的命名规则什么的,相信大家也是... -
操作外部函数的局部变量-易语言
2021-06-12 08:34:40易语言操作外部函数的局部变量 -
js 定时器setTimeout无法调用局部变量的解决办法
2020-10-26 14:52:37javascript中定时器setTimeout无法调用局部变量,只需要将setTimeout的第一个参数改成函数对象,而不是字符串,就可以了 -
关于静态局部变量与静态外部变量
2017-11-09 19:14:10静态局部变量特点:static int a; 1:静态局部变量存储在静态存储区,如果赋有初值,函数调用期间只赋值一次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期间是不释放的...静态局部变量特点:static int a
1:静态局部变量存储在静态存储区,如果赋有初值,函数调用期间只赋值一次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期间是不释放的;而自动变量在每次调用函数时都会重新执行赋值语句,原因:每次函数调用完毕之后,自动变量都会被释放;
2:静态局部变量若开始未赋初值,编译时自动赋初值0或者‘\0’;而自动变量则为不确定值;
3:静态局部变量不能被其他函数引用,即使在函数调用结束该存储区没有被释放;原因:它是局部变量;
4:静态局部变量更不能被其他文件进行extern扩展使用
静态外部变量:
外部变量特点:extern A
编译系统在遇到extern时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;若没有找到就在连接时其他文件中寻找,如找到则进行扩展,若没有找到,则报错;
静态外部变量:一个文件中在函数外面进行定义的静态变量如:static int A 该静态外部变量只能在本文件中使用,不能被其他文件中的extern 扩展;因此static具有将外部变量限制在本文件中作用;
例如:file1 中定义全局变量int A ,在file2中想要使用文件1中的变量A,则只需要在file2 中exten A进行扩展即可使用;如果file1中的全局变量A不希望被其他文件使用,在file1文件定义为:static int A,这样就将变量A限制在本文件中使用;当然在file2执行exten A语句时,会优先检查本文件中是否定义有变量A,如有则使用本文件的变量A;若无在进行外文件的扩展。
-
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2021-01-01 07:20:14本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,... -
转 C51 局部变量、全局变量和外部变量
2021-05-22 15:57:47局部变量:是在函数内部定义的变量,只在定义它的函数内部有效,仅在使用它时,才为它分配内存单元。全局变量:又称外部变量,是在函数外部定义的变量,可以为多个函数共同使用,其有效作用范围是从它定义的位置开始... -
java局部变量是什么意思?Java中局部变量与成员变量有哪些区别?
2021-03-06 18:52:46大家知道Java中的局部变量吗?今天我们要了解的Java的局部变量及它和成员变量的区别,一起来看看吧。什么是局部变量?局部变量时就是只有一部分可见的变量,例如定义在方法中的变量,只有这百个方法才能使用,同一个类... -
全局变量与局部变量,静态变量与动态变量,内部函数与外部函数的区别
2020-06-16 10:15:28一、变量按作用域范围分类 局部变量:在函数内定义的变量,作用域限于函数内。 说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。...如果在定义点前的函数要使用该外部变量,要 -
for循环中的变量是局部变量还是全局变量?
2019-08-25 20:39:08如果想在循环外部调用这个局部变量,那么你就需要扩大它的作用范围,必须在变量名称前面加上global关键字,把它变成一个全局变量,这样即使for循环结束了,这个变量仍然有效。 而在实际的编程操作中,因为全局变量... -
若外部变量与局部变量同名(求最大值)
2015-03-21 14:44:30#include int a = 3,b = 5; //a,b是全局变量 int main() ... //a是局部变量,局部变量a的作用范围主函数结束 printf("max = %d\n",max(a,b)); //全局变量b的作用范围主函数结束 return 0; } int -
内部类引用外部类的局部变量为什么必须是final
2018-10-30 19:18:27内部类引用外部类局部变量,必须保证外部类的局部变量为final的,因为内部类和外部类的局部变量生命周期不一样,外部类方法执行完该局部变量可能就没了,但该方法中的内部类可能还在执行(如线程),还要使用该变量... -
简单解读局部变量和全局变量
2021-05-20 17:41:53今天课课家笔者为大家详细介绍局部变量和全局变量的概念和作用。在函数的参数和返回值中我们认识到形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量只能在函数内部使用,离开该函数就... -
C语言:局部变量与全局变量
2021-01-14 16:42:58局部变量 1)在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问。 2)无显式初始化时默认初始化值为随机值。 3.4静态变量 静态全局变量 与动态全局变量的主要不同:动态全局变量可以通过extern... -
python中使用闭包及修改外部函数的局部变量
2021-11-04 21:27:19print("这是外部的函数") def func1(): print("这是里面的函数") return func1 func() print("*" * 50) # 由于func()的返回值就是函数 # 因此我们可以通过func()()调用里面的函数 func()() 闭包 闭包的... -
js在函数外部调用局部变量的方法
2021-12-01 15:53:34如果直接在函数外部调用局部变量。会发现报错。 <script> function num() { var a = 7; } num(); console.log(a); </script> (1)此时如果在函数内加入window.a=a;则可以在外部调用。 ... -
Python:全局变量与局部变量的问题
2020-12-13 11:05:24在Python中,如果处理不好变量使用的关系,就很容易出现:UnboundLocalError: local variable 'n' referenced before assignment这种错误。一般而言,这种错误都是这么出现的:n = 1def test():n += 1print(n)if __... -
C语言全局变量和局部变量
2021-12-05 20:09:18在C语言的学习过程中,会涉及到**局部变量和全局变量的内存分配和内存释放**问题 -
C语言中的变量(自动变量 静态变量 外部变量 寄存器变量)
2021-12-20 15:26:08extren 外部变量/全程变量(用于外部变量说明) register 寄存器变量 (用于在硬件寄存器中) 四大类所有变量必须先说明(定义),后使用。 自动(动态)变量: 函数中的局部变量不加static关键字修饰就是动态... -
全局变量和局部变量的理解及注意事项 超详细 简单易懂
2021-08-22 16:39:49在函数体内部定义的变量叫做局部变量,在函数体外部定义的变量叫做全局变量。局部变脸只能在定义的那个函数体的内部进行使用,而全局变量在所有函数内部都可以使用。 (2)局部变量: 1.函数执行结束之后,定义在... -
初识Python:全局、局部和非局部变量(带示例)
2020-12-21 15:59:18这意味着,全局变量可以在函数内部或外部访问。我们来看一个关于如何在 Python 中创建一个全局变量的示例。示例 1:创建全局变量x="global"deffoo():print("x inside :",x)foo()print("x outside:",x)当我们运行... -
搞懂JavaScript全局变量与局部变量,看这篇文章就够了
2020-06-26 11:22:06什么是全局变量和局部变量 全局变量:常常定义在函数外部,拥有全局作用域,即在 JavaScript 代码的任何地方都可以访问。 局部变量:定义在函数内部,只能在函数中使用的变量,作用范围是从函数开始到结尾,即在{}... -
匿名内部类访问外部类方法中的局部变量
2019-09-04 16:13:16这里所说的“匿名内部类”主要是指在其外部类的成员方法内定义,同时完成实例化的类,若其访问该成员方法中的局部变量,局部变量必须要被final修饰。 原因是编译程序实现上的困难:内部类对象的生命周期会超过局部... -
什么是全局变量,局部变量,静态全局变量,静态局部变量
2019-05-10 07:30:00什么全局变量,局部变量,静态局部变量,静态全局变量 到这里,我们就可以很容易区分上面的变量类型了。实际上这里只是换了一种说法: 全局:具有文件作用域的变量 静态:具有静态存储期或内部链接属性 局部:具有... -
python3的全局变量和局部变量
2020-12-09 21:26:31局部变量定义在函数体内部的变量称为局部变量函数的形参也是局部变量局部变量的作用范围只在声明该局部变量的函数体内局部变量在函数调用时被创建,在函数调用完成后自动销毁全局变量定义在函数体外,模块内的变量...