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

    2021-01-07 09:59:47
    静态局部变量 在局部变量前加上“static”关键字,就成了静态局部变量静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据...

    静态局部变量

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

    对静态局部变量的说明:
    (1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
    (2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
    (3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
    (4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

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

    制了它的使用范围。  


      static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用 
    的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定 
    义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这 
    些函数的源文件要包含这个头文件  


      static全局变量与普通的全局变量有什么区别:static全局变量只初使化一 
    次,防止在其他文件单元中被引用;  
      static局部变量和普通局部变量有什么区别:static局部变量只被初始化一 
    次,下一次依据上一次结果值;  
      static函数与普通函数有什么区别:static函数在内存中只有一份,普通函 
    数在每个被调用中维持一份拷贝  
      全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量 
    的值不可知。  

    展开全文
  • 全局变量、局部变量、静态全局变量、静态局部变量的区别
  • 原文链接:c语言局部变量 静态局部变量 全局变量与静态全局变量 - L的存在 - 博客园 https://www.cnblogs.com/lanjianhappy/p/6035433.html 基本概念: 作用域:起作用的区域,也就是可以工作的范围。 代码块:...

    原文链接: https://www.cnblogs.com/lanjianhappy/p/6035433.html

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

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

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

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

    栈(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、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; ...


    按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区

    按作用域分:

    1、全局变量在整个工程文件内都有效;

    2、 静态全局变量只在定义它的文件内有效;

    3、 静态局部变量只在定义它的函数内有效,且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
    4、 全局变量 静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。

    5、 静态局部变量 全局变量共享全局数据区, 但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。

    #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在这两个函数里的变化

    展开全文
  • 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、静态...
  • 变量的分类 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按 作用域:全局...
  • C++ 全局变量、静态全局变量、局部变量、静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,610
精华内容 9,044
关键字:

静态局部变量