精华内容
下载资源
问答
  • 局部变量只有自己所在的程序块内有效,也就是说如果你函数内的一对大括号中定义一个局部变量,这个局部变量这个大括号范围内有效,出了大括号就失效了,不论他是否与程序块之外的变量重名。 同C语言的值...

    局部变量只有在自己所在的程序块内有效,也就是说如果你在函数内的一对大括号中定义一个局部变量,这个局部变量只在这个大括号范围内有效,出了大括号就失效了,不论他是否与程序块之外的变量重名。

    同C语言的值传递一样,在调用函数时传入的变量值作为局部变量传入函数内部,不会改变这两个变量的值。

    #include<iostream>
    using namespace std;
    void myFunction();
    void swap(int,int);
    
    int x=5,y=7;
    
    int main()
    {
        cout << "x from main: "<< x <<endl;
        cout << "y from main: " << y << endl<<endl;
        myFunction();
        
        cout << "\nBack from myFunction!"<<endl<<endl;
        cout << "x from main: "<< x <<endl;
        cout << "y from main: " << y << endl;
        cout << "\n\n\n";
        swap(x, y);
        cout <<"x,y in the main:"<<x<<","<<y<<endl;
        
        return 0;
    }
    void myFunction()
    {
        int y=10;
        
        cout << "x from myFunction: "<< x<< endl;
        cout << "y from myFunction: "<< y <<endl;
        {
            int y=20;
            cout << " y in the block:"<<y<<endl;
            
            
        }
        cout<< "y again:"<<y<<endl;
        
        
        }
    void swap(int x,int y)
    {
        int temp ;
        cout<<"\n swap in the function :"<<endl;
        temp=x;
        x=y;
        y=temp;
        cout<<"x,y in the function:  "<<x<<","<<y<<endl;
        
    }





    运行结果:


    x from main: 5
    y from main: 7
    
    x from myFunction: 5
    y from myFunction: 10
     y in the block:20
    y again:10
    
    Back from myFunction!
    
    x from main: 5
    y from main: 7
    
    
    
    
     swap in the function :
    x,y in the function:  7,5
    x,y in the main:5,7
    


    展开全文
  • 静态局部变量

    2014-10-16 10:33:09
    它始终驻留全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。 静态局部变量与全局变量共享全局数据区,但静态局部变量定义它的函数中...
    
    在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其
     初始化为0。
    静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。
    例如,下面的程序定义了全局变量、静态局部变量和局部变量:
     //*********************
    //**   ch5_2.cpp  **
    //*********************

        #include <iostream.h>

        void func();
    int n=1; //全局变量

        void main()
    {
    static int a; // 静态局部变量
    int b= -10; // 局部变量
    cout <<"a:" <<a
    <<" b:" <<b
    <<" n:" <<n <<endl;
    b+=4;
    func();
    cout <<"a:" <<a
    <<" b:" <<b
    <<" n:" <<n <<endl;
    n+=10;
    func();
    }

        void func()
    {
    static int a=2; // 静态局部变量
    int b=5; // 局部变量
    a+=2;
    n+=12;
    b+=5;
    cout <<"a:" <<a
    <<" b:" <<b
    <<" n:" <<n <<endl;
    }

      运行结果为:
        a:0 b:-10 n:l
    a:4 b:10 n:13
    a:0 b:-6 n:13
    a:6 b:10 n:35

    程序中主函数main()两次调用了func()函数,从运行结果可以看出,程序控制每次进入func()函数时,局部变量b都被初始化。而静态局部 变量a仅在第一次调用时被初始化,第二次进入该函数时,不再进行初始化,这时它的值是第一次调用后的结果值4。 main()函数中的变量a和b与func()函数中的变量a和b空间位置是不一样的,所以相应的值也不一样。关于变量作用域和可见性的进一步讨论见第6 章。
    静态局部变量的用途有许多:可以使用它确定某函数是否被调用过。使用它保留多次调用的值。

    对静态局部变量的说明: 
    (1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。 
    (2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。 

    (3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初 值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。 
    (4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

    展开全文
  •  局部变量可以与全局变量同名,函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,同一个函数内可以定义多个同名的局部变量,比如两个循环体内都定义一个同名的局部变量...

    1、局部变量能否和全局变量重名?   

      答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: " 

        局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 

    2、如何引用一个已经定义过的全局变量?   

      答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 


    3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  

      答:可以,在不同的C文件中以static形式来声明同名全局变量。前提是只能有一个C文件中对此变量赋初值,连接才不会出错 

     

    4、语句for( ;1 ;)有什么问题?它是什么意思?  

      答:和while(1)相同。 


    5、do……while和while……do有什么区别?   

      答:前一个循环一遍再判断,后一个判断以后再循环   

    6、请写出下列代码的输出内容   

    #include <stdio.h>     
    main()     
    {      
    int a,b,c,d;      
    a=10;   
    b=a++;    
    c=++a;    
    d=10*a++;   
    printf( "b,c,d:%d,%d,%d",b,c,d);   
    return 0;   
    } 

     

     答:10,12,120 


    7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 

    答:static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

           static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

           static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

     

    (1)用static定义的全局变量,构成静态的全局变量,若是一个源程序由多个源文件组成,一般的全局变量在各个源文件中都是有效的,而用static修饰的全局变量只在定义该变量的源文件中是有效的,因此static限制了全局变量的作用范围。
    (2)普通局部变量在所在的函数每次调用的时候都会被重新分配存储空间,函数结束后,就会回收该存储空间。而用static修饰的局部变量不会,它的值始终保持着。
    (3)static函数与普通函数作用域不同,它仅作用于定义它的源文件中。

    (4)储存方式:程序的局部变量存在于(堆栈)中,全局变量存在于(静态区/全局区)中,动态申请(new)数据存在于(堆)中。

      

    8.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?


    c用宏定义,  #define S(a,b) a*b

    c++用inline  

    引入内联函数的目的是为了解决程序中函数调用的效率问题。内联函数是指用inline关键字修饰的函数。任何在类的说明部分定义的

    函数都会被自动的认为是内联函数。

    它与一般函数所不同之处只在于函数调用的处理。

    内联函数必须是和函数体声明在一起才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数声明,

    我们必须定义函数体。

    Inline tablefunction(int I) {return I*I};  这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。

    但是执行速度确比一般函数的执行速度要快。

    (C#有无内联函数:C#就没有头文件,哪来的内联外联?要说内联,应该全都是内联,因为所有函数什么的都定义在一个文件里。存在内联函数,但要注意,在何处内联代码的决定完全由CLR做出,我们无法使用像C++中inline这样的关键字来控制那些方法是内联的。)

     

     

    全局变量、局部变量、静态全局变量、静态局部变量的区别

    C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

    从作用域看:

    全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

    静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

    局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

    静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

    从分配内存空间看:
    全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

     

     

    全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

        1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
      2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

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

    Tips:
      A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
      B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
      C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
        D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
        E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    -----------------------------------------------------------------------------------------------------------

    static 全局变量:改变作用范围,不改变存储位置

    static 局部变量:改变存储位置,不改变作用范围

    静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

                    如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可。

     

     

    参考:

    https://www.cnblogs.com/burandanxin/archive/2009/10/16/1584735.html

    https://blog.csdn.net/Zhanganliu/article/details/79185251

    展开全文
  • 这里讲静态局部变量在编译赋初值,没有初值自动赋初植 0(对数值型交量)或空字符'\0'(对字符变量)。应该是在编译就分配了空间 在对生存期和作用域解释又有这样的例子,如图 ![图片说明]...
  • 一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。此时如果想要访问成员变量,可以通过 this 关键字来访问,this 关键字来访问,this 为当前实例的引用,如果要访问类变量,可以通过类名...

    成员变量和局部变量同名


    在同一个作用域内不允许定义同名的多个变量。

     

    在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。此时如果想要访问成员变量,可以通过 this 关键字来访问,this 关键字来访问,this 为当前实例的引用,如果要访问类变量,可以通过类名来访问。

     

     

    局部变量的作用域最小化

     

    将局部变量的作用域最小化,可增加代码的可读性和可维护性,并且降低出错的可能性。

     

    局部变量最小化以下规则:

    1、在需要使用局部变量的时候,才定义它。

    2、使方法小而集中。

    全局变量与局部变量的区别
    全局变量与局部变量的区别
    一、变量的分类
    变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
    按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内
    存的静态存储区域,局部变量存放在内存的栈区。
    按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在
    定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是
    程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定
    义它的函数内有效,但是函数返回后失效。
    全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。
    局部变量的值不可知。
    静态全局变量,只本文件可以用。
    全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程
    序结束.省略了存储类型符,系统将默认为是自动型.
    静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定
    义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量

    是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的
    字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运
    行结束后,才释放所占用的内存.
    自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存
    在程序运行中是重复使用的.

    二、介绍变量的作用域
    在讨论函数的形参变量时曾经提到, 形参变量只在被调用期间才分
    配内存单元,调用结束立即释放。这一点表明形参变量只有在函数
    内才是有效的, 离开该函数就不能再使用了。这种变量有效性的范
    围称变量的作用域。不仅对于形参变量, C 语言中所有的量都有自
    己的作用域。变量说明的方式不同,其作用域也不同。 C 语言中的
    变量,按作用域范围可分为两种, 即局部变量和全局变量。
    一、局部变量
    局部变量也称为内部变量。局部变量是在函数内作定义说明的。
    其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。
    例如:
    int f1(int a) /*函数f1*/
    {
    int b,c;
    ……
    }a,b,c 作用域
    int f2(int x) /*函数f2*/
    {
    int y,z;
    }x,y,z 作用域
    main()
    {int m,n;
    }
    m,n 作用域在函数 f1 内定义了三个变量,a 为形参,b,c 为一
    般变量。在 f1 的范围内a,b,c 有效,或者说a,b,c 变量的作用域限
    于f1内。同理,x,y,z 的作用域限于f2内。 m,n 的作用域限于main
    函数内。关于局部变量的作用域还要说明以下几点:
    1. 主函数中定义的变量也只能在主函数中使用,不能在其它函
    数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为
    主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语
    言不同的,应予以注意。
    2. 形参变量是属于被调函数的局部变量,实参变量是属于主调
    函数的局部变量。
    3. 允许在不同的函数中使用相同的变量名,它们代表不同的对
    象,分配不同的单元,互不干扰,也不会发生混淆。如在例5.3 中,
    形参和实参的变量名都为n,是完全允许的。4. 在复合语句中也可
    定义变量,其作用域只在复合语句范围内。例如:
    main()
    {
    int s,a;
    ……
    {
    int b;

    s=a+b;
    ……b 作用域
    }
    ……s,a 作用域
    }
    [例5.11]main()
    {
    int i=2,j=3,k;
    k=i+j;
    {
    int k=8;
    if(i==3) printf("%d\n",k);
    }
    printf("%d\n%d\n",i,k);
    }
    main()
    {
    int i=2,j=3,k;
    k=i+j;
    {
    int k=8;
    if(i=3) printf("%d\n",k);

    }
    printf("%d\n%d\n",i,k);
    }
    本程序在 main中定义了i,j,k 三个变量,其中k未赋初值。而
    在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个
    k 不是同一个变量。在复合语句外由main 定义的k 起作用,而在复
    合语句内则由在复合语句内定义的k 起作用。因此程序第4 行的k 为
    main 所定义,其值应为5。第7 行输出k 值,该行在复合语句内,由
    复合语句内定义的k 起作用,其初值为8,故输出值为8,第9 行输
    出i,k 值。i 是在整个程序中有效的,第7 行对i赋值为3,故以输
    出也为3。而第9 行已在复合语句之外,输出的k 应为main 所定义
    的k,此k值由第4 行已获得为5,故输出也为5。
    二、全局变量
    全局变量也称为外部变量,它是在函数外部定义的变量。它不
    属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。
    在函数中使用全局变量,一般应作全局变量说明。只有在函数内经
    过说明的全局变量才能使用。全局变量的说明符为extern。但在一
    个函数之前定义的全局变量,在该函数内使用可不再加以说明。例
    如:
    int a,b; /*外部变量*/
    void f1() /*函数f1*/
    {

    ……
    }
    float x,y; /*外部变量*/
    int fz() /*函数fz*/
    {
    ……
    }
    main() /*主函数*/
    {
    ……
    }/*全局变量x,y 作用域全局变量a,b 作用域*/
    从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,
    都是全局变量。但x,y 定义在函数f1 之后,而在f1 内又无对x,y
    的说明,所以它们在f1内无效。a,b 定义在源程序最前面,因此在
    f1,f2 及main 内不加说明也可使用。
    [例5.12]输入正方体的长宽高l,w,h。求体积及三个面
    x*y,x*z,y*z 的面积。
    int s1,s2,s3;
    int vs( int a,int b,int c)
    {
    int v;
    v=a*b*c;s1=a*b;
    s2=b*c;
    s3=a*c;
    return v;
    }
    main()
    {
    int v,l,w,h;
    printf("\ninput length,width and height\n");
    scanf("%d%d%d",&l,&w,&h);
    v=vs(l,w,h);
    printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3);
    }
    本程序中定义了三个外部变量s1,s2,s3, 用来存放三个面积,
    其作用域为整个程序。函数vs用来求正方体体积和三个面积, 函数
    的返回值为体积v。由主函数完成长宽高的输入及结果输出。由于C
    语言规定函数返回值只有一个, 当需要增加函数的返回数据时,用
    外部变量是一种很好的方式。本例中,如不使用外部变量, 在主函
    数中就不可能取得v,s1,s2,s3 四个值。而采用了外部变量, 在函数
    vs 中求得的s1,s2,s3 值在main 中仍然有效。因此外部变量是实现
    函数之间数据通讯的有效手段。对于全局变量还有以下几点说明:1. 对于局部变量的定义和说明,可以不加区分。而对于外部变
    量则不然,外部变量的定义和外部变量的说明并不是一回事。外部变
    量定义必须在所有的函数之外,且只能定义一次。其一般形式为:
    [extern] 类型说明符变量名,变量名… 其中方括号内的extern 可
    以省去不写。
    例如: int a,b;
    等效于:
    extern int a,b;
    而外部变量说明出现在要使用该外部变量的各个函数内, 在整
    个程序内,可能出现多次,外部变量说明的一般形式为: extern 类
    型说明符变量名,变量名,…; 外部变量在定义时就已分配了内存
    单元, 外部变量定义可作初始赋值,外部变量说明不能再赋初始值,
    只是表明在函数内要使用某外部变量。
    2. 外部变量可加强函数模块之间的数据联系,但是又使函数要
    依赖这些变量,因而使得函数的**性降低。从模块化程序设计的观点
    来看这是不利的, 因此在不必要时尽量不要使用全局变量。
    3. 在同一源文件中,允许全局变量和局部变量同名。在局部变
    量的作用域内,全局变量不起作用。
    [例5.13]
    int vs(int l,int w)
    {
    extern int h;

    int v;
    v=l*w*h;
    return v;
    }
    main()
    {
    extern int w,h;
    int l=5;
    printf("v=%d",vs(l,w));
    }
    int l=3,w=4,h=5;
    本例程序中,外部变量在最后定义, 因此在前面函数中对要用
    的外部变量必须进行说明。外部变量l,w 和vs 函数的形参l,w 同
    名。外部变量都作了初始赋值,mian函数中也对l作了初始化赋值。
    执行程序时,在printf 语句中调用vs 函数,实参l 的值应为main
    中定义的l 值,等于5,外部变量l 在main 内不起作用;实参w 的
    值为外部变量w 的值为4,进入vs 后这两个值传送给形参l,wvs 函
    数中使用的h 为外部变量,其值为5,因此v的计算结果为100,返
    回主函数后输出。变量的存储类型各种变量的作用域不同, 就其本
    质来说是因变量的存储类型相同。所谓存储类型是指变量占用内存空
    间的方式, 也称为存储方式。
    变量的存储方式可分为“静态存储”和“动态存储”两种。
    静态存储变量通常是在变量定义时就分定存储单元并一直保持
    不变, 直至整个程序结束。5.5.1 节中介绍的全局变量即属于此类
    存储方式。动态存储变量是在程序执行过程中,使用它时才分配存储
    单元, 使用完毕立即释放。典型的例子是函数的形式参数,在函数
    定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,
    调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、
    释放形参变量的存储单元。从以上分析可知, 静态存储变量是一直
    存在的, 而动态存储变量则时而存在时而消失。我们又把这种由于
    变量存储方式不同而产生的特性称变量的生存期。生存期表示了变
    量存在的时间。生存期和作用域是从时间和空间这两个不同的角度
    来描述变量的特性,这两者既有联系,又有区别。一个变量究竟属
    于哪一种存储方式, 并不能仅从其作用域来判断,还应有明确的存
    储类型说明。
    在C 语言中,对变量的存储类型说明有以下四种:
    auto 自动变量
    register 寄存器变量
    extern 外部变量
    static 静态变量
    自动变量和寄存器变量属于动态存储方式, 外部变量和静态变
    量属于静态存储方式。在介绍了变量的存储类型之后, 可以知道对
    一个变量的说明不仅应说明其数据类型,还应说明其存储类型。因
    此变量说明的完整形式应为: 存储类型说明符数据类型说明符变

    量名,变量名…; 例如:
    static int a,b; 说明 a,b 为静态类型变量
    auto char c1,c2; 说明 c1,c2 为自动字符变量
    static int a[5]={1,2,3,4,5}; 说明 a 为静整型数组
    extern int x,y; 说明 x,y为外部整型变量。
    总结与区别: 变量根据定义的位置的不同的生命周期,具有不同的
    作用域,作用域可分为6 种:全局作用域,局部作用域,语句作用域,
    类作用域,命名空间作用域和文件作用域。
    从作用域看:
    全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可
    以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需
    要用extern 关键字再次声明这个全局变量。
    静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初
    始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变
    量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体
    始终可见。
    局部变量也只有局部作用域,它是自动对象(auto),它在程序运行
    期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执
    行结束后,变量被撤销,其所占用的内存也被收回。
    静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序
    包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件
    里,即被static 关键字修饰过的变量具有文件作用域。这样即使两
    个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的
    变量。
    从分配内存空间看:
    全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,
    而局部变量在栈里分配空间。
    全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方
    式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局
    变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非
    静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制
    了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其
    它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文
    件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中
    引起错误。
    1)、静态变量会被放在程序的静态数据存储区(全局可见)中,这样可
    以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变
    量和堆变量的区别。
    2)、变量用static 告知编译器,自己仅仅在变量的作用范围内可见。

    这一点是它与全局变量的区别。
    从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存
    储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了
    它的作用域,限制了它的使用范围。因此static 这个说明符在不同
    的地方所起的作用是不同的。应予以注意。
    Tips:
    A.若全局变量仅在单个C 文件中访问,则可以将这个变量修改为
    静态全局变量,以降低模块间的耦合度;
    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数
    的静态局部变量,以降低模块间的耦合度;
    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量
    的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全
    局可见;
    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使
    用static 变量(这样的函数被称为:带“内部存储器”功能的的函数)
    E.函数中必须要使用static 变量情况:比如当某函数的返回值为指
    针类型时,则必须是static的局部变量的地址作为返回值,若为auto
    类型,则返回为错指针。

    展开全文
  • C/C++变量根据定义位置的不同,具有不同的作用域和存储域。 作用域可分为6种:全局作用域,局部作用...全局变量具有全局作用域,只需一个源文件中定义,就可以作用于所有的源文件。当然,其它不包括全局变量定义的
  • 非静态局部变量和静态局部变量

    千次阅读 2013-06-24 14:04:27
    函数中的局部变量,那么这个变量只被初始化赋值为0一次, 当这个函数被多次调用,除第一次被调用 m 的内容被初始化为0外, 以后每次调用,m 都会在上一次函数被调用产生结果的基础上继续运行的。 例如 ...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 函数返回局部变量问题

    千次阅读 2016-05-21 20:16:02
    但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过...
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • 调试时变量的监视窗口显示的值出现错误,或者张冠李戴,或者本来程序中已经赋值显示出来的却没有,如果让程序变量输出,却是正确的。  有人已经提出了解决问题的方法:将项目属性的C++常规设置中的“调试信息...
  • static有两种用法:面向...全局变量、局部变量、静态全局变量、静态局部变量的区别  C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,
  • 全局变量局部变量静态全局变量、静态局部变量的区别转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 it ...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域,它只被初始化一
  • 全局变量与局部变量的区别

    千次阅读 2016-09-08 12:42:12
    全局变量与局部变量的区别   ...变量可以分为:全局变量、静态全局变量、静态局部变量局部变量。...按存储区域分,全局变量、静态全局变量和静态局部...静态局部变量定义它的函数内有效,只是程序仅分配一次内
  • 局部变量与全局变量区别

    千次阅读 2016-12-09 23:02:02
    局部变量使用之前必须赋初始值。  例如:int var = 0;  System.out.println(var); 一、变量的分类变量可以分为:全局变量、静态全局变量、静态局部变量局部变量。 按存储区域分,全局变量、静态全局...
  • 全局变量和局部变量同名

    千次阅读 2020-06-05 11:18:56
    c语言中,变量有全局变量和局部变量之分,这一点和很多高级语言类似,如c#,java等。不过与c#,java中的局部变量全局变量作用域内则不允许与全局变量名相同,而c语言是允许这样做的。这样的做法极不提倡,但是...
  • C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。...静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直
  • 1,全局变量,和局部变量的生存周期咋样呢,存储位置呢?? 2,假如全局变量和局部变量定义...假如一个全局变量定义最底部,那么上面的那些程序可以用这些全局变量吗??? 下面大家一起看个程序: #include
  • 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域...
  • 局部变量局部变量是用户可自定义的变量,它的作用范围仅在程序内部。在程序中通常用来储存从表中查询到的数据,或当作程序执行过程中暂存变量使用。局部变量必须以“@”开头,而且必须先用DECLARE命令说明后才可使用...
  • SQL中的全局变量 局部变量

    千次阅读 2014-03-18 23:37:02
    变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。 局部变量 ...局部变量是一个能够拥有特定数据类型的对象,它的作用...局部变量被引用其名称前加上
  • 全局变量和局部变量的区别

    万次阅读 多人点赞 2018-08-23 21:46:04
    静态全局变量:使用 static 关键字修饰,也具有全局作用功能,和全局变量区别在于如果该程序包含多个文件,其作用范围仅定义的那个文件,不能作用于其它文件,这样即使两个不同的源文件都定义了相同名字的静态...
  • static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static类中...全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据
  • 一 查看运行时数据: ...(1)gdb中可以查看三种变量的值:全局变量(所有文件可见)、局部变量(当前scope可见)和静态全局变量(当前文件可见)。 (2)局部变量会隐藏全局变量,如果需要查看全局变量的值需使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,753
精华内容 51,901
关键字:

在程序运行时某局部变量