精华内容
下载资源
问答
  • 全局变量本身就是静态存储方式,静态全局变量也是静态存储方式,全部变量的... 把局部变量改变为静态局部变量后是改变了它的存储方式即改变了它的生存期,局部变量在栈中,static局部变量在静态存储区,静态局部变量只

         全局变量本身就是静态存储方式,静态全局变量也是静态存储方式,全部变量的作用域是整个源程序,static 全局变量指限定了定义该变量的源文件内有效

    在同一原程序的其它源文件不能使用它, static全局变量只初始化一次,防止在其它文件单元被引用;


        把局部变量改变为静态局部变量后是改变了它的存储方式即改变了它的生存期,局部变量在中,static局部变量在静态存储区,静态局部变量只初始化一次,下一次依据上一次的结构


      static 函数与普通函数作用域不同,static函数在当前原文件中定义和说明,仅在当前源文件中使用。static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

    展开全文
  • 静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存。...类内局部静态变量所有对象共享一个,在编译时分配内存。 #include <iostream> #include <...

    静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存。通过类名,对象,成员函数都可以访问静态成员变量。
    类的静态成员变量需要在类外分配内存空间。
    静态成员函数只能调用静态成员变量。
    成员函数可以调用静态成员变量和静态成员函数。
    类内局部静态变量所有对象共享一个,在编译时分配内存,在第一次函数跑到这里时初始化,之后不再初始化。

    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class test
    {
    public:
        static int m_value1;		//声明私有类的静态成员变量
        int m_value2;
     
    public:
        test()
        {
        	m_value1++;
        }
        
        static int getValue1(){
            return m_value1;
        }
    
        int getValue2(){
            static int i = 1;//编译时赋值,所有对象公用一个
            return ++i;
        }
    
        int getValue()	//定义类的静态成员函数
        {
        	return m_value1;
        }
    };
     
    int test::m_value1 = 0;		//类的静态成员变量需要在类外定义并且分配内存空间
     
    int main()
    {
        test t1;
        test t2;
        test t3;
        
        cout << "test::m_value1 = " << test::m_value1 << endl;	//通过类名直接调用公有静态成员变量,获取对象个数
        cout << "t3.m_value1 = " << t3.m_value1 << endl;		//通过对象名名直接调用公有静态成员变量,获取对象个数
        cout << "t3.getValue() = " << t3.getValue() << endl;	//通过对象名调用普通函数获取对象个数
        cout << "t1.getValue2() = " << t1.getValue2() << endl;//2
        cout << "t2.getValue2() = " << t1.getValue2() << endl;//3
        cout << "t3.getValue2() = " << t1.getValue2() << endl;//4
        return 0;
    }`在这里插入代码片`
    
    展开全文
  • 1. static 变量静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,...2. 静态局部变量静态局部变量属于静态存储方式,它具有以下特点:(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其...

    1. static 变量

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

    2. 静态局部变量
    静态局部变量属于静态存储方式,它具有以下特点:
    (1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
    (2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。
    (3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以 看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的 值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成 意外的副作用,因此仍以采用局部静态变量为宜。

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

    4. static 函数…..

    内部函数和外部函数

    当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。
    1 内部函数(又称静态函数)
    如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
    定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
    static 函数类型 函数名(函数参数表)
    {……}
    关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
    使用内部函数的好处是: 不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

    2 外部函数
    外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
    [extern] 函数类型 函数名(函数参数表)
    {……}
    调用外部函数时,需要对其进行说明:
    [extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];

    [案例]外部函数应用。
    (1)文件mainf.c
    main()
    { extern void input(…),process(…),output(…);
    input(…); process(…); output(…);
    }

    (2)文件subf1.c
    ……
    extern void input(……)
    {……}
    (3)文件subf2.c
    ……
    extern void process(……)
    {……}
    (4)文件subf3.c
    ……
    extern void output(……)
    {……}



    1、static 声明的变量在C语言中有两方面的特征:

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

    2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。


    2、问题:Static的理解
      关于static变量,请选择下面所有说法正确的内容:

      A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

      B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

      C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

      D、静态全局变量过大,可那会导致堆栈溢出。

      答案与分析:

      对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。

      对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。

      对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。

      因此,答案是A、B、C。

    3、问题:不可重入函数

      曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?

    unsigned int sum_int( unsigned int base )
    {
     unsigned int index;
     static unsigned int sum = 0; // 注意,是static类型的。
     for (index = 1; index <= base; index++)
     {
      sum += index;
     }
     return sum;
    }


      答案与分析:

      所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

      这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

      将上面的函数修改为可重入的函数很简单,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto 类型的变量,函数即变为一个可重入的函数。

      当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

     

    转载于:https://www.cnblogs.com/daochong/p/6890520.html

    展开全文
  • 局部变量在函数内定义变量,作用域限于函数内。 说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。 (2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部...

    一、变量按作用域范围分类

    局部变量:在函数内定义的变量,作用域限于函数内。

    说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。
    (2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。
    (3)允许在不同的函数中使用相同的变量名,但它们代表不同的对象,占用不同的存储单元,互不干扰。
    (4)在复合语句中也可以定义变量,但其作用域只能在复合语句内。
    全局变量:在函数外定义的变量,它的作用域是从变量定义开始,到程序文件的末尾。如果在定义点前的函数要使用该外部变量,要使用关键字extern。
    说明:(1)全局变量由于一个文件中所有函数都能引用全局变量的值,因为在一个函数中能够改变了变量的值会对其他函数产生影响,带来不安全性,并且一直占用存储空间,所以不建议用
    (2)全局变量和局部变量同名时,在函数中全局变量隐藏,局部变量起作用。
    实例:

    #include <stdio.h>
    void gx();
    void gy();
    int main()
    {
    	extern int x,y;				///用extern将外部变量的作用域扩展到前面
    	printf("1:x=%d,y=%d\n",x,y);
    	y=246;
    	gx();
    	gy();
    	return 0;
    }
    void gx()
    {
    	extern int x,y;				//用extern将外部变量的作用域扩展到前面
    	x=135;
    	printf("2:x=%d,y=%d\n",x,y);
    }
    int x,y;						//定义外部变量
    void gy()
    {
    	printf("3:x=%d,y=%d\n",x,y);
    

    二、变量按生存周期分类

    动态变量:动态变量在函数调用时分配存储空间,函数调用结束后释放存储空间。它可以是函数的形参,局部变量,函数调用时的现场保护和返回地址。
    静态变量:在运行期间由系统分配固定的存储空间,在静态存储区的变量。它可以是全局变量,也可以是局部变量。

    几个关键字:

    1. auto:动态变量,一般可省略。
    2. static:静态变量,分为静态局部和静态全局。
      (1)静态局部变量:它和局部变量的区别在于函数退出时,变量始终存在,但不能被其他函数使用,当再次进入该函数时,能保存上次的结果继续使用。如果不赋初值,则自动赋初值0或空字符。
      (2)静态全局变量:只在定义它的源文件中可见,在其他源文件中不可见。它和全局变量的区别是,全局变量可以使用关键字extern被其他源文件使用,而静态全局变量不能。
    3. register:寄存器变量,不存入内存,直接保存在CPU内的寄存器中,提高执行速度。一般把使用最频繁的变量定义为register变量,如循环变量。它不能是静态变量,只能是动态变量。
      例如:
    {
    	register int i;
    	for(i=0;i<n;i++)
    	{
    		...
    	}
    	...
    }	
    

    三、按函数能否被其他源文件使用,分为内部函数和外部函数

    内部函数: 只能被本程序文件调用,和其他文件中的同名函数互不干扰。使用关键字static+函数。例如:

    static int max(int a,int b)
    {
    ...
    }
    

    外部函数: 可以被其他文件调用,使用关键字extern+函数,如果省略extern,则默认为外部函数。例如:

    extern int fun(int x,int y)
    {
    ...
    }
    

    实例:

    #include <stdio.h>
     
    void func();//函数声明,主要是因为被调用的函数定义写在了main函数后面了
     
    int n = 1; //全局变量
     
    int  main(void)
    {
        static int a; // 静态局部变量,但静态局部变量只在定义它的函数中可见,并且只初始化一次
        int b = -10; // 局部变量
     
        printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
     
        b += 4;
     
        func();
     
        printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
        n += 10;
     
        func();
        printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
     
    }
    void func()
    {
        static int a = 2; // 静态局部变量
        int b = 5; // 局部变量
        a += 2;
        n += 12;
        b += 5;
       printf("func:   a=%d,   b=%d,   n=%d\n",a,b,n);
    }
    

    运行结果:
    在这里插入图片描述
    结果分析:

    首先明确main函数和func函数里面都有静态局部变量a和局部变量b,由于它们的固有性质,它们都只在定义它的函数里有效,所以它们互不干扰,所以只要在本函数里分析即可,而全局变量n,在main和func函数里都有效,所以分析它的值应该考虑n在这两个函数里的变化

    展开全文
  • 相同点 定义在静态变量区,生命周期都与进程相同 不同点 全局静态变量可以被整个...局部静态变量只能定义函数内调用,并且第二次调用该函数时,静态变量的值为上次被调用最后的值,不为重新定义初始化的值。 ...
  • 作用域为整个源程序( 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的)。 2、静态全局变量: 存储区也在静态存储区。static限制作用域,作用域为本文件有效(定义该变量的源文件)...
  • 定义在函数外,可被本文件及其他文件的函数使用(外部链接),其他文件使用时序用extern声明 生命周期和程序运行周期一样 不同文件的全局变量不可以重名 局部变量 如果没有赋初值,内容为随机 如果定义在符合语句...
  • /*首先说个最让我震惊的:main里的变量竟然也是局部变量,我的天啊,我可能真读了一个假书。一直都觉得它是全局变量,我可能学了假c语言*/要搞清全局变量局部...静态局部变量也是定义在函数内部的,静态局部变量定...
  • 变量可以分为全局变量、静态全局变量、静态局部变量和局部变量。 按照存储区分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量...局部变量在定义它的函数内有效,但是函数返回后失效
  • 局部静态变量:和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同。局部静态变量只在此函数内部用。在函数退出时它不死亡,而是保持其值等待函数下一次被...
  • 全局变量和局部变量在写代码时需要区分清楚,不然会出大问题。不同语言定义不同范围的变量的写法有很大的区别。那么静态变量是在什么场景下用到呢?我们来假设这样一个场景:在函数内部定义的变量,当程序执行到它的...
  • 1. static 变量  静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但...(1)静态局部变量在函数内定义 它
  • 局部静态变量局部静态变量就是定义在函数内部的静态变量,它的初始化发生在该函数第一次被调用时,当执行到局部静态变量定义语句时进行初始化的。利用这一点可以实现懒汉式单例模式static Singleton & ...
  • 全局变量=={普通全局变量静态全局变量} ...在函数的内部定义变量叫做局部变量。 一般来说尽量不要使用全局变量,它最大的特点就是不安全,任何一个函数都可以修改它的值。 生命周期 存储位置 默认值 ...
  • (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。 (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与...
  • static 静态变量,普通变量和全局变量,静态局部变量 ...静态局部变量只在定义函数内有效,程序只分配一次内存,函数返回后,该变量值不会变化。 静态函数和普通函数 静态函数:静态函数只能本文件中使用...
  • 关于局部变量、局部静态变量定义 局部变量:形参和函数体内部定义的变量。 局部静态变量:将局部变量定义为static类型。 三者区别 1.形参是一种自动对象,是由传递函数的实参进行初始化,作用域仅仅是所在函数...
  • 静态变量和静态函数

    2019-07-31 16:17:46
    变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部...局部变量在定义它的函数内有效,但是函数返回后失效。 ...
  • 静态变量函数

    2019-11-23 14:57:54
    作用域和链接 作用域描述了名称(变量)文件...静态变量作用域取决于如何定义 类中声明的成员变量作用域为整个类 名称空间中声明的变量作用域为整个名称空间 C++函数的作用域: 整个类或整个名称空间,...
  • 静态局部变量:存放在静态区(全局区),程序开始到结束一直存在,作用范围所声明定义函数体内; 静态全局变量:区别于全局变量,全局变量默认的修饰符是“extern”,作用范围是整个程序的源代码文件,而静态...
  • Python实现局部静态变量

    千次阅读 2017-01-07 16:02:03
    python没有局部静态变量,但可以通过以下几种方式实现类似于C语言的函数内局部静态变量。1、定义函数属性python中一切皆对象,函数也是一个对象,因此可以给函数定义属性:def func(): func.x+=1 print(func.x) ...
  • 全局变量:其是所有的函数体的外部定义的,程序的所有部分(甚至...静态全局变量:全局变量前加关键字static,全局变量就定义为一个全局静态变量。 静态局部变量:出现一个作用域,是局限一个函数中的,经...
  • 因为python为动态语言,处理变量的方式与一些静态语言(比如C++)不大一样,这里对这些变量进行小小的总结python中全局变量与C语言中类似,也就是的那个单页面所有函数外头定义的变量局部变量函数内定义变量,...
  • 全局变量又叫成员变量,它是声明类里,函数,静态语句块外的变量,全局变量又分为类变量(静态变量)、实例变量两种. 通过代码来看一下: 1 2 private int i;//实例变量 private static int j;//类变量 实例变量总是通过...
  • static/静态全局变量作用域有限,局限一个源文件定义它的源文件),不能被同一源程序的其他源文件使用,避免引起错误。(因而同名静态全局变量可以被定义在不同源文件中,使用关键字static) 普通全局变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,752
精华内容 700
关键字:

局部静态变量在函数内定义