静态变量

倾耳听 倾耳听     2022-09-08     642

关键词:

static静态变量的理解

静态变量 类型说明符是static。

静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。

另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。

静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。



一、静态局部变量:

1、 Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数 被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘 若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一 直占据存储空间的变量。

2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。

4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

example:

//考察静态局部变量的值。


# include < stdio. h>

int f( int a)
{
    auto b = 0;
    static c = 3;

    b = b + 1;
    c = c+ 1;
    return ( a+ b+ c) ;
}

main( )
{
    int a = 2, i;

    for ( i = 0; i < 3; i + + )
        printf ( "%d " , f( a) ) ;
}

//求1~5的阶乘。

/*
由于f为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。若变量f说明为自动变量(去掉static),当main中多次调用factor时,f均赋初
值为1,故每次输出值均为1。
*/

# include < stdio. h>

long factor( int n)
{
    static long int f = 1; //static
    f * = n;
    return f;
}

main( )
{
    int i;
    for ( i = 1; i < = 5; i+ + )
        printf ( "%ld " , factor( i) ) ;
}



二、静态全局变量

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
   
这两者的区别虽在于:
1、非静态全局变量的作用域是整个源程序 ,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件 内有效,在同一源程序的其它源文件(即声明了该变量的CPP文件,或包含该变量声明头文件的CPP文件)中不能使用它。
   
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
   
从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

关于Static关键字
1.静态变量,分配在静态存储区,在数据段中。函数退出之后,变量值不变。
2.作用域,全局的静态变量、静态函数只能在本文件中使用。(不同于一般全局变量)
局部的静态变量同函数的局部变量


五大内存分区(貌似与编译原理中不一样,不过道理是一样的,实际存在的东西总是会与理论有一定差距的)
1.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
2.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
3.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
4.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
5.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
6.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)



另外:

1)、static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

2)、static静态变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。——有信息隐蔽的作用。 (外部的 Static声明亦可用于声明函数。如果将函数声明为Static类型,则该函数名除了对该函数声明所在的文件可见外,其他文件均无法访问。 )

3)、若全局变量仅在单个C文件中访问,则可将此变量改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可将此变量改为该函数的静态局部变量,以降低模块间的耦合度。


4)、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。
    所谓"可重入"(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

 

静态变量全局变量和局部变量

...需要用extern关键字再次声明这个全局变量。2.全局变量、静态全局变量、静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。3.全局变量、静态变量的生命期和程序生命期是一样的,... 查看详情

公共静态变量和私有静态变量之间的区别

】公共静态变量和私有静态变量之间的区别【英文标题】:Differencebetweenpublicstaticandprivatestaticvariables【发布时间】:2012-05-1415:03:12【问题描述】:classEmployee//salaryvariableisaprivatestaticvariableprivatestaticdoublesalary;//DEPARTMENTisaconstantpublic 查看详情

静态变量与实例变量:区别?

】静态变量与实例变量:区别?【英文标题】:StaticvsInstanceVariables:Difference?【发布时间】:2014-02-0721:16:52【问题描述】:静态变量和实例变量有什么区别。以下句子是我无法理解的:在某些情况下,类的所有对象只应共享特定... 查看详情

静态变量和实例变量的区别?

语法区别:静态变量需要static关键字修饰,实例变量不需要。程序运行时的区别:静态变量从属于类,实例变量从属于对象。  实例变量必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;  静... 查看详情

静态变量

static静态变量的理解静态变量类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运... 查看详情

类的静态变量

在C++类中可以定义静态成员变量(使用static声明)1、静态成员变量属于整个类所有2、静态成员变量的生命期不依赖任何对象3、可以通过类名直接访问静态成员变量(设置成public),也可以通过对象名访问4、所有对象共享类的... 查看详情

静态变量和成员变量的区别

1.所属不同静态变量属于类,所以也称为类变量;成员变量属于对象,所以也称为实例变量(对象变量)。2.内存中位置不同静态变量存储于方法区的静态区;成员变量存储于堆内存。3.内存出现时间不同静态变量随着类的加载而... 查看详情

静态是啥意思

物理学术用语.‘静态’一词可以理解为停止不动,不动的状态下就称为静态。从物理的角度讲就是静止状态,一个不动的状态。计算机用语    1.静态变量:.  静态变量的类型关键字是static。静态变量当然... 查看详情

对于静态变量和动态变量

(1)下面拿静态全局变量和全局变量举例子,但是实际上 这对于局部变量原理是一样的    全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别... 查看详情

请问c++语言里静态变量和全局变量有啥区别?谢谢

还见到过静态全局变量什么的,我觉得那就是包含了静态变量和全局变量的各自的特点,我感觉静态和全局是从两个不同的角度看待变量的,但是究竟是什么角度,刚才查的一些都比较零碎,希望能得到条理比较清晰而且比较全... 查看详情

java之静态函数和静态变量

静态变量:静态变量好似一种成员变量,它的特点是前面有static。普通变量会有多份,它在每个对象当中都存在,但是静态变量只有一份,它是属于类的。静态变量的调用方法:1.类名.变量名Customer.name="中南大学"2.对象名.类名a1... 查看详情

静态变量和成员变量的区别(代码片段)

 静态变量和成员变量的不同: ①所属范围不同。静态变量是属于类范围的;成员变量是属于对象范围的。②存活时间不同。类的一生有着静态变量的伴随;而成员变量只能陪类走一程,对象产生的时候它就产生,而且它... 查看详情

js静态方法静态变量实例方法实例变量

1、静态方法的定义 Js代码  var BaseClass = function() {}; // var BaseClass=new Function();  BaseClass.f1 = function(){//定义静态方法 &nbs 查看详情

面向对象——概念(成员变量静态变量成员方法静态方法垃圾回收机制重载包)

静态变量和成员变量的区别:    1、成员变量描述的是对象的特征,包含在对象之中。不同的对象成员变量彼此独立。一个对象成员变量的改变,不会影响其他对象。    静态变量独立在对象之外,... 查看详情

静态变量静态方法

/*作者:qingfeng日期:2017/2/20功能:类变量(静态变量),类方法(静态方法)统计学费总和*/publicclassDemo3_4{   publicstaticvoidmain(Stringargs[]){      Stus1=newStu(23,"qingfeng",200);  查看详情

局部变量静态局部变量全局变量与静态局部变量

 基本概念:作用域:起作用的区域,也就是可以工作的范围。代码块:所谓代码块,就是用{}括起来的一段代码。数据段:数据段存的是数,像全局变量就是存在数据段的代码段:存的是程序代码,一般是只读的。栈(stack):... 查看详情

从静态方法访问静态变量

】从静态方法访问静态变量【英文标题】:Accessstaticvariablefromstaticmethod【发布时间】:2012-06-2907:53:46【问题描述】:我想通过静态方法访问静态变量:#!/usr/bin/envpythonclassMessenger:name="world"@staticmethoddefget_msg(grrrr):return"hello"+grrrr.name... 查看详情

java中static静态变量大小

1.static静态变量1.1使用static修饰属性,静态变量(或类变量)属性,按是否使用static修饰,又分为:静态属性Vs非静态属性(实例变量)1.2实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其... 查看详情