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

    千次阅读 多人点赞 2018-09-05 21:09:07
    静态变量: ...所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且...

    静态变量
    静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放 ,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来。
    所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
    静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

    展开全文
  • 静态变量 static

    千次阅读 2016-04-07 11:30:41
    静态变量是一个非常重要的知识点,无论笔试面试,都是一个高频的考点!确实也十分重要,这里简单的总结一下,它C与C++中的作用!!以备后用! 变量的生命周期与作用域 静态变量属于静态存储方式,其存储空间为内存中...

    静态变量是一个非常重要的知识点,无论笔试面试,都是一个高频的考点!确实也十分重要,这里简单的总结一下,它C与C++中的作用!!以备后用!

    静态变量的实现原理:

      static变量在第一次调用函数时,static变量初始化。第二次,及以后调用函数,static变量不会初始化。static变量在编译时会被默认初始化为0。

    #include <iostream>
    using namespace std;
    void fun(int i)
    {
    	static int num=i;
    	int *p=#
    	cout<<num<<endl;
    	num++;
    }
    int main()
    {
    	for(int i=10;i>0;i--)
    		fun(i);
    	system("pause");
    	return 0;
    }
    运行结果:


    结论:如果是static修饰的变量,其中编译器会专门设置一个位为标志位,如果该变量第一次被初始化,则该位i被设置为1,初始值为0。当再次进入的时候,如果发现该标志位是1,则不再对该位进行初始化;由于其值的生命周期是整个程序,所以当我们调用它的时候,其值就为上一次我们修改过的值,而不是初始值。

    变量的生命周期与作用域

    静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束。

    (相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。

    void show1()
    {
    	if(1)
    	{
    		static int b=1 ;
    		//作用域就是所在的大括号,生命周期长;一直存在;
    	}
    //	printf("%d\n",b++); //不能使用;
    }
    

    静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。

    #include <iostream>
    using namespace std;
    //虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,
    //而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量
    void show()
    {
    	static int a =10;   a++; 	cout<<a<<endl;
    }
    int main()
    {
    	show();  	show();	 //cout<<a<<endl;
    	//)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,
    	//即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
    	system("pause");
    	return 0;
    }


    静态变量是在程序执行之前创建,并在程序的整个执行过程中一直存在。


    所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式
    变量的存储方式可分为:“静态存储”和“动态存储”两种。
    静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。全局变量即属于此类存储方式。
    动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。
    典型的例子是函数的形式参数,在函数定义时并不给行参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。


    C中作用域及生命周期 函数 文件 程序
    static int b;
    1.静态变量的作用域是变量定义时所在在的大括号,其他都不好使,没定义,但是该变量一直存在;
    2.生命周期是整个程序;
    3.静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
    把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
    把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

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



    C++中被static修饰的成员变量,
    1.静态成员函数与非静态成员函数的根本区别是:
    静态成员函数没有this指针,而非静态成员函数含有一个指向当前对象的this指针,隐藏了这么一个参数;
    2.静态变量或函数在编译的时候就已经存在;静态变量必须在类外进行初始化
    3.大师言论“静态函数和静态变量是类的组成部分,而不是类对象的组成部分。可用“类名::静态变量名“的形式直接调用”。
    4.静态函数里定义的变量是普通的,若想是静态的,必须加关键字static;
    静态成员函数,内联函数,友元函数,构造函数,不能申明为虚函数!

    对象:无名对象,常量对象,指针对象,实例对象;

    实例如下:

    #include <iostream>
    using namespace  std;
    struct student
    {
    	int num;
    	char c;
    };
    
    class aa
    {
    public:
    	static int num;          //静态成员变量;申明类型,并未定义
    	static student stu[2];  //静态结构体变量;	
    	int n;
    	aa()
    	{
    		//num=100;  //静态变量必须在类外进行初始化,如果不放在类外,定义一个对象就会创建一份,重复定义,竞争资源;
    	}
    
    	static void show()  //没有对象的那个this指针;所有对象指向一个,不确定this到底指向谁;
    	{  	
    		//只能是static成员属性;
    		cout<<num<<endl;
    		int a ;//静态函数定义的变量还是普通变量;静态变量一定要加static关键字;
    		//cout<<n<<endl;  //对非静态成员N 的非法引用;
    		//普通成员属性在没有对象的时候是没有空间的,所以n是非法访问,
    	}
    };
    
    int aa::num=100;  //静态变量需在类外初始化,num在类外,用作用域来声明;
    
    student aa::stu[]={{1,'a'},{2,'b'}};
    student aa::stu[2]={{1,'a'},{2,'b'}};
    //静态结构体的两种初始化方式;
    
    int main()
    {
    // 	aa a ;
    // 	cout<<a.num<<endl;  //a.num==aa::num 意义一样,可以采用对象直接调用,其实编译器是只认类型(aa)不认对象(a),只是通过a找到aa类型的;
    	cout<<aa::num<<endl;  //静态变量在编译时就申请了空间;所以不需要创建对象也可以调用;
    	cout <<sizeof (aa)<<endl;  //没有生成对象,所以大小是4;若没有int n,则为1(占位,实例化唯一)静态变量在编译的时候就分配了空间;
    	//sizsof(aa)表示用aa去定义变量,需要申请多大的空间;
    	aa b;
    	b.num++;
    	aa c;  //不同的对象指向的是同一个空间;
    	//静态成员属性属于这个类,而不是属于某个对象,所有的对象共享这个静态成员;		 
    	cout<<c.num<<endl;//值改变了;
    	cout<<aa::show<<endl;//打印该函数入口地址;
    	aa::show();  //调用静态函数;
    
    	system("pause");
    	return 0;
    }
    


    本人愚钝,领悟至此,颇有感慨,与己共勉,陋文浅显,见者海涵。



    展开全文
  • 静态变量static/动态变量auto的区别: 1.静态变量: #include #include long Func(int n); int main() { int i,n; printf("Input n:"); scanf("%d",&n); for(i=1;i;i++) { printf("%d! = %ld\n",i,Func

    静态变量static/动态变量auto的区别:

    1.静态变量:

    #include <stdio.h>
    #include <stdlib.h>
    long Func(int n);
    int main()
    {
       int i,n;
       printf("Input n:");
       scanf("%d",&n);
       for(i=1;i<=n;i++)
       {
           printf("%d! = %ld\n",i,Func(i));
       }
        return 0;
    }
    
    long Func(int n)
    {
        static long p = 1;  //只在第一次被调用时,被初始化为1,以后其值被保存在静态存储区不变直到被改写
        p = p*n;
        return p;
    }
    

    结果如图:



    2.动态变量:

    #include <stdio.h>
    #include <stdlib.h>
    long Func(int n);
    int main()
    {
       int i,n;
       printf("Input n:");
       scanf("%d",&n);
       for(i=1;i<=n;i++)
       {
           printf("%d! = %ld\n",i,Func(i));
       }
        return 0;
    }
    
    long Func(int n)
    {
        auto long p = 1;  //每次执行都被初始化为1
        p = p*n;
        return p;
    }
    
    执行结果如下:


    来自哈尔滨工业大学MOOC课件

    展开全文
  • 静态变量static(C)

    万次阅读 多人点赞 2018-12-19 15:19:13
    静态变量在函数间调用时保持他们的值不变。 它的语法结构为: static c_type data_name; 其中,c_type 为基础的数据类型,data_name是变量名。 生存期 生存期的概念是在程序执行过程中体现的。程序开始执行后,对所...

    static

    static是C语言关键字之一。
    static 数据类型用来给变量创建永久存储空间。静态变量在函数间调用时保持他们的值不变。
    它的语法结构为:
    static c_type data_name;
    其中,c_type 为基础的数据类型,data_name是变量名。

    生存期

    生存期的概念是在程序执行过程中体现的。程序开始执行后,对所需要的变量申请空间,直至这个变量被销毁。这段时间便是一个变量的生存期。
    由于静态变量static在第一次被调用时被创建,当主函数被销毁时才会被销毁。那么的话,其生存期便会远远的超过创建它的那个函数。这样就达到了对其延寿的作用。

    void fun(int x)
    {
    	static int a = x;
    	static int b = 0;
    	a++;
    	printf("a= %d \n", a);
    }
    int main()
    {
    	for (int i = 10; i > 0; i--)
    	{
    		fun(i);
    	}
    	system("pause");
    	return 0;
    }
    

    由于a是静态变量,所以当第一次开辟空间时被赋予了10。那么它在fun函数销毁时并不会被销毁,并且在fun函数被再次调用时不会被创建。所以本程序的输出结果如下所示。
    静态变量测试结果示意图
    由图可见,静态变量可以自加。

    可见性

    可见性指的是在编译过程中对于一个变量来说,可以被使用的能力。静态变量的可见性如同普通变量,向下可见。

    	a = 10;
    	static int a;
    

    输入以上程序,编译器会提醒你未定义标识符a。

    原理

    当函数被调用的时候,会在栈区申请一段内存,来存放函数内的变量。当函数调用结束时,这段内存便会被释放。而静态变量static申请的内存不在栈区。而在数据区。当函数被销毁时,它不会随着函数的销毁而释放,从而实现了其生存期超过了函数本身的功能。
    当静态变量static被创建时,在数据区为其分配了一段空间,并且分配了一个标志符,设为1。当经过第一次赋值之后,该标志符被设为0。再次声明该变量时,由于其已经存在并且标志位为0,因此系统不会将其声明值赋给该变量(原文为:从而限制了之后对其的赋值)。

    展开全文
  • 静态变量 static 全局变量 global

    千次阅读 2008-04-17 11:29:00
    静态变量 static 全局变量 global  静态变量 在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static,存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了...
  • 在局部变量前加上“static”关键字,就成了静态局部变量静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序...
  • 局部静态变量static详解

    万次阅读 多人点赞 2018-05-22 08:03:20
    原帖地址: https://blog.csdn.net/zkangaroo/article/details/61202533在局部变量前加上“static”关键字,就成了静态局部变量静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该...
  • 静态变量static的作用

    2016-11-08 14:49:17
    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明...
  • 静态变量 static 的定义

    千次阅读 2016-04-22 10:34:50
    静态变量也可以用于存储常数。 具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且无法在...
  • C语言 静态变量static的用法

    万次阅读 多人点赞 2017-03-15 09:55:16
    第一个作用: 修饰变量变量又分为局部和全局变量,但他们都存在内存的静态区  静态全局变量,作用于仅限于变量被定义的文件。其他文件即使用extern声明也没法使用,准确说就是作用域是从定义处开始,到文件结束...
  • Java中类的生命周期为: 1.... ... 3.1静态变量、静态代码块初始化 3.2构造函数 3.3自定义构造函数 4.使用 4.1对象初始化 ..
  • 1、全局变量是不显示用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内...2、全局静态变量是显示用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。
  • 静态变量 static 浅谈

    2013-07-31 10:48:56
    声明之前加上static,就是静态变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效...
  • 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。  静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函数...
  • 利用静态变量static,输出1到5的阶乘值。解:程序: #includeint fac(int n){ static int f=1; f = f*n; return f;}int main(){ int i; for (i = 1; i { printf("%d!=%d\n",i,fac(i)); } return 0;}结果:1!=12!=...
  • C/C++静态变量static详解

    万次阅读 2015-09-12 08:07:29
    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。  静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函数内部声明...
  • 静态变量static的内存图

    千次阅读 2015-10-29 17:31:01
    public class Person { public static void main(String[] args) { PersonDemo pd=new PersonDemo(10); PersonDemo.getName("旺财"); pd.speak(); System.out.print(PersonDemo.name.../*static静态变量与成
  • 静态变量static和extern外引用

    千次阅读 2016-04-15 15:19:21
    静态变量--加static关键字的变量,特点: (1)在全局数据区中分配内存,每次对其值得修改都会保留结果,直至程序结束。 (2)若静态变量没显示初始化,那会被自动初始化为0,并且只能初始化一遍。 1、全局变量: 有...
  • 静态方法:在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 ...是用来做基础运算的,所有的方法都不需要实例变量值,因为方法都是静态的 Math.abs(24.2); static int abs
  • 全局变量int i是在整个工程可见的,但是在另外文件是不能用(假设工程是由两个源文件1.cpp、2.cpp链接而成,全局变量定义在1.cpp,而2.cpp不能用,虽然... (1)静态局部变量在函数内定义,但不象自动变量那样,当调用
  • VC中静态变量Static

    千次阅读 2013-08-29 15:33:53
     静态变量(static).静态变量之所以是因为静态,是因为他在整个程序生命周期的地址静止不变。也就是说在整个程序里面只保存有一份拷贝。static关键字允许它在不同的函数调用间保持它的值。如果一个静态变量被访问后...
  • static在程序运行中只初始化一次,内存地址只分配一次
  • (1)Static关键字作用修饰符 可以修饰成员(成员属性 成员方法)(2)Static修饰成员的特点a 生命周期长 跟类相同b 用Static修饰的变量 所有对象共享c Static修饰变量 可以通过对象(.)点的形式调用 还可以通过类名...
  • 后来经过排查,发现正是保存登录信息的静态变量被回收。软件有登录功能,登录后获取一些帐号信息,写了一个类专门存放用static变量保存这些信息。 网上说的移到application发现不现实,工作量太大太复杂,后来发现...
  • java 静态方法和静态变量 static

    千次阅读 2007-12-26 16:23:00
    在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法介绍一个类Math:The class Math contains methods for performing basic numeric operations是用来做基础运算的,所有的方法都不需要实例...
  • 静态变量Static的用法与区别

    千次阅读 2013-01-25 17:39:03
    static有两种用法: 1、在文件中定义; 如 a.c static int flag; void func() { //... } 在这种情况下,主要的作用是说明flag是a.c的私有变量,不在a.c这个文件的其它函数不能访问flag. 2.在函数定义 ...
  • 在变量声明前加上关键字 static,可以使局部变量保留多次调用一个方法所得的值。例如: static int hitCount = 0;...和其他常见的局部变量不同,静态变量的初始值为 0,所以前面显示的初始值是

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,218
精华内容 15,287
关键字:

静态变量static