精华内容
下载资源
问答
  • 本文主要介绍了C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别。具有很好的参考价值,下面跟着小编一起来看下吧
  • 全局变量、局部变量静态全局变量、静态局部变量的区别
  •   基本概念: 作用域:起作用的区域,也就是可以工作的范围。...C语言中局部变量就分配在栈中。   局部变量  普通的局部变量定义的时候直接定义或者在前面加上auto void func1(void){&nbs...

     

    基本概念: 作用域:起作用的区域,也就是可以工作的范围。

    代码块:所谓代码块,就是用{}括起来的一段代码。

    数据段:数据段存的是数,像全局变量就是存在数据段的

    代码段:存的是程序代码,一般是只读的。

    栈(stack):先进后出。C语言中局部变量就分配在栈中。

     

    局部变量

      普通的局部变量定义的时候直接定义或者在前面加上auto

    void func1(void)
    {
     int i = 1;
     
     i++;
     
     printf("i = %d.\n", i);
    }
    局部变量i的解析:
    在连续三次调用func1中,每次调用时,在进入函数func1后都会创造一个新的变量i,
    并且给它赋初值1,然后i++时加到2,
    然后printf输出时输出2.然后func1本次调用结束,
    结束时同时杀死本次创造的这个i。这就是局部变量i的整个生命周期。
    下次再调用该函数func1时,又会重新创造一个i,经历整个程序运算,
    最终在函数运行完退出时再次被杀死。

     

    静态局部变量(static) 静态局部变量定义时前面加static关键字。

    总结:

    1、静态局部变量和普通局部变量不同。静态局部变量也是定义在函数内部的,静态局部变量定义时前面要加static关键字来标识,静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上一次调用时执行后这个变量的值。本次接着来使用。

    2、静态局部变量在第一次函数被调用时创造并初始化,但在函数退出时它不死亡,而是保持其值等待函数下一次被调用。下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。

    3、静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同

     

    全局变量 定义在函数外面的变量,就叫全局变量。

    普通全局变量  普通全局变量就是平时使用的,定义前不加任何修饰词。普通全局变量可以在各个文件中使 用,可以在项目内别的.c文件中被看到,所以要确保不能重名。

    静态全局变量  静态全局变量就是用来解决重名问题的。静态全局变量定义时在定义前加static关键字, 告诉编译器这个变量只在当前本文件内使用,在别的文件中绝对不会使用。这样就不用担心重名问题。所以静态的全局变量就用在我定义这个全局变量并不是为了给别的文件使用,本来就是给我这个文件自己使用的。

    跨文件引用全局变量(extern) 就是说,你在一个程序的多个.c源文件中,可以在一个.c文件中定义全局变量g_a,并且可以在别的另一个.c文件中引用该变量g_a(引用前要声明)

    函数和全局变量在C语言中可以跨文件引用,也就是说他们的连接范围是全局的,具有文件连接属性,总之意思就是全局变量和函数是可以跨文件看到的(直接影响就是,我在a.c和b.c中各自定义了一个函数func,名字相同但是内容不同,编译报错。)。

     

    局部变量和全局变量的对比:
    1、定义同时没有初始化,则局部变量的值是随机的,而全局变量的值是默认为0.
    2、使用范围上:全局变量具有文件作用域,而局部变量只有代码块作用域。
    3、生命周期上:全局变量是在程序开始运行之前的初始化阶段就诞生,到整个程序结束退出的时候才死亡;而局部变量在进入局部变量所在的代码块时诞生,在该代码块退出的时候死亡。
    4、变量分配位置:全局变量分配在数据段上,而局部变量分配在栈上。

    //static

    复制代码
     1 #include <stdio.h>
     2 
     3 
     4 void func1(void);
     5 void func_static(void);
     6 void func_static2(void);
     7 void func_global(void);
     8 void func_register(void);
     9 
    10 int g_a = 1;
    11 
    12 
    13 int main(void)
    14 {
    15     //a = 4;            // 编译报错,未定义
    16     g_a = 5;            // 可以,因为g_a是全局变量,所以到处都可以用
    17 
    18     func1();        // i = 2
    19     func1();        // i = 2
    20     func1();        // i = 2
    21     
    22     func_static();    // a = 2
    23     func_static();    // a = 3
    24     func_static();    // a = 4
    25     
    26     func_static2();    // a = 4;
    27     func_static2();    // a = 7;
    28     func_static2();    // a = 10;
    29     
    30     func_global();    // g_a = 4;
    31     func_global();    // g_a = 7;
    32     func_global();    // g_a = 10;
    33     
    34     func_register();
    35     func_register();
    36     func_register();
    37     
    38     
    39     
    40     
    41 // 因为i是定义在函数func中的局部变量,所以i的作用域为代码块作用域,所以i只在func1
    42 // 函数内部有效,在func1外面是不能访问i的。所以这里i会无定义。
    43     //i = 5;        // error: ‘i’ undeclared (first use in this function)
    44     
    45     return 0;
    46 }
    47 
    48 
    49 void func1(void)
    50 {
    51     int i = 1;                // 普通的局部变量,auto可以省略的
    52     //auto int i = 0;            // 自动局部变量,其实就是普通局部变量
    53     
    54     i++;
    55     
    56     printf("i = %d.\n", i);
    57 }
    58 
    59 void func_static(void)
    60 {
    61     static int a = 1;        // 静态的局部变量
    62     
    63     a++;
    64     
    65     printf("a = %d.\n", a);
    66 }
    67 
    68 void func_static2(void)
    69 {
    70     static int a = 1;        // 静态的局部变量
    71     
    72     a += 3;
    73     
    74     printf("a = %d.\n", a);
    75 }
    76 
    77 void func_global(void)
    78 {
    79     g_a += 3;
    80     
    81     printf("g_a = %d.\n", g_a);
    82 }
    83 
    84 void func_register(void)
    85 {
    86     register int a = 1;        // 静态的局部变量
    87     
    88     a += 3;
    89     
    90     printf("a = %d.\n", a);
    91 }
    复制代码

    //globle

    复制代码
     1 #include <stdio.h>
     2 
     3 
     4 int g_i = 13;
     5 
     6 
     7 // 实验结论:
     8 // 首先,main函数是一个程序运行最开始执行的东西,所有的其他函数都只能在main函数中被
     9 // 直接或者间接的调用才能被执行。main函数的执行其实就是整个程序的生命周期,main函数
    10 // 一return返回,整个程序就结束了。
    11 // 其次,全局变量的定义和初始化是在main函数运行之前发生的。
    12 int main(void)
    13 {    
    14     printf("g_i = %d.\n", g_i);
    15     
    16     return 0;
    17 }
    复制代码
    复制代码
     1 #include <stdio.h>
     2 
     3 
     4 void func_in_a(void);
     5 extern int g_a;                // 声明了一个int变量g_a
     6 //extern int g_b;
     7 
     8 void func_in_b(void)
     9 {
    10     printf("I am func in b.c.\n");
    11 }
    12 
    13 
    14 int main(void)
    15 {
    16     printf("I am main in a.c.\n");
    17     printf("I am main in a.c, g_a = %d.\n", g_a);
    18     printf("I am main in a.c, g_a = %d.\n", g_b);
    19     
    20     
    21     //func_in_b();        // 直接调用
    22     
    23     func_in_a();        // 间接调用
    24     
    25     return 0;
    26 }
    复制代码
    复制代码
     1 #include <stdio.h>
     2 
     3 
     4 
     5 void func_in_b(void);
     6 
     7 int g_a = 12;
     8 int g_b = 111;
     9 
    10 
    11 
    12 
    13 
    14 
    15 void func_in_a(void)
    16 {
    17     
    18     g_a = 24;
    19     
    20     printf("I am in func_in_a of a.c, g_a = %d.\n", g_a);
    21     func_in_b();
    22 }
    23 
    24 /*
    25 // 定义错误
    26 // C语言中,定义函数都必须在外面,不能在一个函数里面定义别的函数
    27 // 所以没有局部函数,只有全局函数。
    28 
    29 void func1(void)
    30 {
    31     int a;
    32     
    33     
    34     void func2()
    35     {
    36         int b;
    37     }
    38 }
    39 
    40 */
    复制代码

    //最后两个分别为a.c b.c 文件目录为

     

    展开全文
  • C++ 全局变量、局部变量静态全局变量、静态局部变量的区别 C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和...

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

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

    从作用域看:

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

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

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

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

    从分配内存空间看:

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

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

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

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

    Tips:

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

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

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

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

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

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

    展开全文
  • 静态局部变量 存在全局区 不初始化内容为0 整个进程结束空间释放 只能在定义所在的复合语句中有效 静态全局变量 存在全局区 不初始化内容为0 整个进程结束空间释放 只能在当前源文件中使用 ...
    项目ValueValueValueValue
    普通局部变量存在栈区不初始化内容随机只在定义的复合语句中有效复合语句结束变量空间释放
    普通全局变量存在全局区不初始化内容为0整个进程结束空间释放能被当前源文件或其他源文件使用,其他源文件使用时要加extern
    静态局部变量存在全局区不初始化内容为0整个进程结束空间释放只能在定义所在的复合语句中有效
    静态全局变量存在全局区不初始化内容为0整个进程结束空间释放只能在当前源文件中使用
    展开全文
  • 全局变量局部变量静态全局变量、静态局部变量的区别转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 it ...
    全局变量局部变量静态全局变量、静态局部变量的区别

    转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html

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

    从作用域看:

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

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

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

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

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





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

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

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

    Tips:
      A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
      B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
      C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
    展开全文
  • 1、局部变量能否和全局变量重名?  答:,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 全局变量、局部变量全局静态变量、局部静态变量的区别。要从分配内存的位置和作用域入手来解释。 全局变量,分配的内存在静态存储区内存上面,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用,...
  • 概念首先得明白局部变量静态局部变量全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...
  • 静态全局变量,静态局部变量,全局变量,局部变量静态全局变量,静态局部变量,全局变量,局部变量
  • 全局变量、全局静态变量局部变量、局部静态变量区别
  • 静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量...
  • 全局静态变量:静态区 在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:   1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作...
  • 今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中
  • 静态变量:存储在全局数据区(静态数据区) 2、生命期 动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效 静态变量:程序结束时才释放 3、作用域 动态变量:...
  • 普通全局变量静态全局变量 在全局变量(外部变量)的说明之前再冠以static就构成了静态全局变量。 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。 这两者的...
  • 静态局部变量的特点: 1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还...虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。复制代码 代码如下:functio
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • 局部变量在函数的开头定义在函数内的符合语句内定义作用范围在包含该局部变量的函数内有效一个函数内部,可以在复合函数语句中定义变量,这些变量只在本复合语句中有效,这种符合语句称为分程序或程序块 #include<...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 ...1>全局变量具有全局作用域...2>静态局部变量
  • 全局变量、static全局变量、static局部变量都在全局区(静态区),而局部变量在栈区。2.生命周期 全局变量、static全局变量、static局部变量都存在于程序的整个生命周期中;局部变量存在于函数执行期间,函数结束,...
  • 变量可以分为全局变量、静态全局变量、静态局部变量局部变量 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分:全局变量在整个工程文件内都...
  • Tables 作用域 存储方式 生命周期 初始化 java C/C++ 全局变量(外部变量) 整个工程文件内 内存的静态存储区域 ... 静态全局变量 定义它的文件内 内存的静态存储区域 整个源程序 0 类里声

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 161,474
精华内容 64,589
关键字:

局部变量能覆盖全局静态变量