精华内容
下载资源
问答
  • 静态变量

    千次阅读 2007-05-30 15:23:00
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
     静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
    由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

      1. 静态局部变量

      在局部变量的说明前再加上static说明符就构成静态局部变量。

      例如:

    static int a,b;
    static float array[5]={1,2,3,4,5};

     
      静态局部变量属于静态存储方式,它具有以下特点:

      (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

      (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

      (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

      (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的 副作用,因此仍以采用局部静态变量为宜。

      [例5.15]

    main()
    {
    int i;
    void f(); /*函数说明*/
    for(i=1;i<=5;i++)
    f(); /*函数调用*/
    }
    void f() /*函数定义*/
    {
    auto int j=0;
    ++j;
    printf("%d/n",j);
    }

      程序中定义了函数f,其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:

    main()
    {
    int i;
    void f();
    for (i=1;i<=5;i++)
    f();
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }

      由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。读者可自行分析其执行过程。

      2.静态全局变量

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

      四、寄存器变量

      上述各类变量都存放在存储器内, 因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

      [例5.16]

    求∑200i=1imain()

    {
    register i,s=0;
    for(i=1;i<=200;i++)
    s=s+i;
    printf("s=%d/n",s);
    }

      本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:

      1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

      2. 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器,由于CPU 中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。

      三、静态变量

      静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
    由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

      1. 静态局部变量

      在局部变量的说明前再加上static说明符就构成静态局部变量。

      例如:

    static int a,b;
    static float array[5]={1,2,3,4,5};

     
      静态局部变量属于静态存储方式,它具有以下特点:

      (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

      (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

      (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

      (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的 副作用,因此仍以采用局部静态变量为宜。

      [例5.15]

    main()
    {
    int i;
    void f(); /*函数说明*/
    for(i=1;i<=5;i++)
    f(); /*函数调用*/
    }
    void f() /*函数定义*/
    {
    auto int j=0;
    ++j;
    printf("%d/n",j);
    }

      程序中定义了函数f,其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:

    main()
    {
    int i;
    void f();
    for (i=1;i<=5;i++)
    f();
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }

      由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。读者可自行分析其执行过程。

      2.静态全局变量

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

      四、寄存器变量

      上述各类变量都存放在存储器内, 因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

      [例5.16]

    求∑200i=1imain()

    {
    register i,s=0;
    for(i=1;i<=200;i++)
    s=s+i;
    printf("s=%d/n",s);
    }

      本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:

      1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

      2. 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器,由于CPU 中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。
    展开全文
  • C#中的静态变量与非静态变量

    千次阅读 2020-01-29 16:38:55
    一:为什么要有静态变量 C#中没有全局变量的概念,所有的变量必须由该类的实例进行操作,这样做是为了提升安全性,但是有些时候会显得很不方便,所以引入了静态变量 二:静态变量与非静态变量的区别 ——静态变量...

    一:为什么要有静态变量

    C#中没有全局变量的概念,所有的变量必须由该类的实例进行操作,这样做是为了提升安全性,但是有些时候会显得很不方便,所以引入了静态变量


    二:静态变量与非静态变量的区别

    ——静态变量是通过类名去访问的
    非静态变量是当该变量所在的类被实例化后,通过实例化的对象名访问

     


    ——静态变量是全局变量,被所有类所共享,即一个类中改变了这个静态变量后,其他类读到的就是变化后的值
    非静态变量是局部变量,不共享改变的值

     


    ——静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡。而非静态变量需要被实例化后才会分配内存

     


    ——静态变量生命周期为应用程序的生命周期。非静态变量的生命周期取决于实例化的类的生命周期

    展开全文
  • 类的静态变量在内存中只有一个,java虚拟机在类加载的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。 而实例变量取决于...

           类的静态变量在内存中只有一个,java虚拟机在类加载的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。

            而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆中,其生命周期取决于实例的生命周期。

    public class Test11 {
    	public static int staticVar = 0;
    	public int instanceVar = 0;
     
    	public Test11() {
    		staticVar++;
    		instanceVar++;
    		System.out.println("staticVar=" + staticVar + ",instanceVar="
    				+ instanceVar);
    	}
     
    	public static void main(String[] args) {
    		Test11 test = new Test11();
    		Test11 test1 = new Test11();
    		Test11 test2 = new Test11();
    	}
    }
    
    
    
    无论创建多少个实例对象,永远都只分配一个staticVar变量,
    并且每创建一个实例对象,这个staticVar就会+1;
    但是,每创建一个实例对象,就会分配一个instanceVar,
    即可能分配多个instanceVar,并且每个instanceVar的值都各自+1

    1.内存分配
    静态变量类加载过程中被分配在方法区里;
    而非静态变量需要被实例化后才会分配内存,分配在堆。
    2.生存周期
    静态变量生存周期为类的存在周期;
    非静态变量的存在周期取决于实例化对象的存在周期。
    3.调用方式
    静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
    非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
    4.共享方式
    静态变量被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
    非静态变量是局部变量,不共享的。
    5.访问方式
    静态成员不能访问非静态成员;
    非静态成员可以访问静态成员。 
     

    展开全文
  • 静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量...

    转自:http://www.cnblogs.com/yangfengming/archive/2009/06/23/1509559.html

    静态变量

    静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量。对于自动变量(局部变量),属于动态存储方式。当自动变量用static定义后就成为了静态自动变量。或静态局部变量,从而成为静态存储方式。

    局部变量

    以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。

    静态局部变量

    1.静态局部变量在函数类定义,但它不像局部变量那样,当调用时就存在,推出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

    2.静态局部变量的生存期虽然为整个源程序,当期作用域仍与自动变量相同。只能在定义改变量的函数内使用该变量,退出该函数后,尽管改变了还继续存在,但不能使用它。

    3.允许对构造类静态局部变量赋初值。若未赋予初值,则有系统自动赋予0值。

    4.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的

      量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的

      值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜.

    全局静态变量与全局变量的区别

    1.全局变量的说明之前再冠以static就构成了静态的全局变量,全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式了。这两者在存储方式上并无同。

    2.非静态全局变量的作用域是整个原程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,及只在定义该变量的源文件内有效,在

      同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该院文件内的函数公用,因此可以避免其他源文件中引起错误。

    总结

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



    转自:http://justshare.iteye.com/blog/407168

    要讲清静态变量与全局变量的区别,要从四个方面:一为修饰符,二为存储地址,三为生命周期,四为外部可访问性。 
    修饰符:全局变量在源文件的函数外部声明(不含extern),但若其它源文件要调用这个变量,就需要通过extern关键字来引用一下。静态变量用static来修饰; 
    存储地址:两者都是存储在静态存储区,非堆栈上,它们与局部变量的存储分开; 
    生命周期:两者都是在程序编译时或程序装入时由系统自动分配的,程序结束时消亡; 
    外部可访问性:全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的私有变量,它的可访问性只限定于声明它的那个源文件,即作用域仅局限于本文件(静态函数也一样); 

    由于它们都是由系统分配的存储空间,所以它们的存储地址是固定的,但值是可变的

    展开全文
  • 静态变量与非静态变量的区别如下: 1.内存分配 静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡; 而非静态变量需要被实例化后才会分配内存。 2.生存周期 静态变量生存...
  • C语言中的静态变量和非静态变量

    万次阅读 2017-11-30 15:05:52
    1.全局静态变量:在全局变量前面加上关键词static,全局变量就被定义成一个全局静态变量。 (1)内存中的位置:静态存储区。 (2)作用域:在程序任何地方都是可见的。 2.局部静态变量:在局部变量前面加上关键词...
  • Java学习笔记之静态方法(类方法),非静态方法(成员方法),静态变量(类变量),非静态变量(成员变量)之间的关系 首先明白这几个名词的意思: 静态方法:即类方法,在类之中,以static关键字申明的方法。 ...
  • C#中静态变量与非静态变量的区别

    千次阅读 2017-12-08 09:42:32
    静态变量与非静态变量的区别如下:  1.内存分配  静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;  而非静态变量需要被实例化后才会分配内存。  2.生存周期  静态...
  • 为什么静态方法不能调用非静态变量,非静态方法可以引用静态变量?理由很简单,静态方法不属于对象,是属于类的,是不需要实例化的,而非静态变量是属于对象的,需要先实例化。在一个类的静态成员中去访问其非静态...
  • [Java]静态变量与非静态变量的区别

    千次阅读 2016-08-30 12:56:47
    ①java类的成员变量有俩种: ...类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周
  • c# 静态变量与非静态变量区别

    千次阅读 2015-05-23 16:08:31
    c# 静态变量与非静态变量区别 静态变量静态变量使用 static 修饰符进行声明 在所属类被装载时创建 生存周期为应用程序的存在周期 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值(全局变量,被所有类...
  • 全局变量、全局静态变量、局部变量、局部静态变量区别
  • 静态变量与动态变量

    万次阅读 多人点赞 2018-08-02 20:21:10
    静态变量,全局动态变量都是静态存储 2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放 3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式...
  • 静态成员变量,不能使用this,super关键字,可以使用在静态方法中,也可以使用在非静态方法非静态变量:1.属于对象中的属性2.对象被初始化存放在,堆内存区中(因为对象一直存放在堆内存区域中)3.非静态变量,不能...
  • python静态变量和静态方法

    万次阅读 2019-04-15 19:36:42
    一、静态变量和静态方法 1、静态变量和静态方法都属于类的静态成员,它们与普通的成员变量和成员方法不同,静态变量和静态方法只属于定义它们的类,而不属于某一个对象。 2、静态变量和静态方法都可以通过类名和...
  • 静态变量和非静态变量的区别

    千次阅读 2013-09-03 21:33:49
    静态变量和非静态变量的区别: 非静态变量可以有局部变量和全局变量 静态变量实际上就是指在内存中的地址是静态不变的。 1、内存分配:局部变量存储在堆区或者栈区,静态变量和全局变量一样存储在全局区, 静态...
  • 1.全局静态变量只能被当前源文件引用,不能被工程里其它源文件引用。 除了这点特殊,其它与普通的全局变量一样。 2.局部静态变量,只执行一次初始化,只能被所在函数引用,函数执行 完毕,变量仍存在,生存周期...
  • 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:   1、栈区(stack)— 由编译器自动分配...
  • SpringBoot使用@Value给静态变量注入值

    万次阅读 多人点赞 2018-07-17 21:34:52
    SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如,application-dev.properties 配置文件有如下配置: 给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示: ...
  • 静态变量static

    千次阅读 多人点赞 2018-09-05 21:09:07
    静态变量静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放 ,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来...
  • (类变量)静态变量和实例变量的区别?

    万次阅读 多人点赞 2017-07-21 21:34:29
    静态变量在类中,不属于实例对象,属于类所有,只要程序加载了字节码,不用创建实例对象静态变量就会被分配空间,已经可以使用。 实例变量是某个对象的属性,只有实例化对象后,才会被分配空间,才能使用。 类变量...
  • 由于c语言基础不够扎实,就开始使用c++,所以一直对静态变量这个概念模棱两可,现在总结如下: 本文只针对c++类外定义的静态变量,因为只有这个场景下的静态变量才和c语言的静态变量是同一个概念。 1,全局静态...
  • Java 静态类、静态方法和静态变量

    万次阅读 多人点赞 2017-11-06 15:44:52
    转载自Java 静态类、静态方法和静态变量Java 静态类、静态方法和静态变量static 是Java中的一个关键字,我们不能声明普通外层类或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将类级别的变量声明为...
  • //静态变量、非静态变量、构造函数调用顺序 //先调用静态变量,然后是非静态变量,再然后是构造函数。。静态变量在调用一次后不会再被调用加载,而非静态变量则会调用多次。。 public class StaticInitialization { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,686
精华内容 37,074
关键字:

静态变量