精华内容
下载资源
问答
  • C语言 静态变量static的用法

    万次阅读 多人点赞 2017-03-15 09:55:16
    第一个作用: 修饰变量变量又分为局部和全局变量,但他们都存在内存的静态区  静态全局变量,作用于仅限于变量被定义的文件。其他文件即使用extern声明也没法使用,准确说就是作用域是从定义处开始,到文件结束...

    static有两个作用

    第一个作用: 修饰变量,变量又分为局部和全局变量,但他们都存在内存的静态区

                  静态全局变量,作用于仅限于变量被定义的文件。其他文件即使用extern声明也没法使用,准确说就是作用域是从定义处开始,到文件结束,

                           在定义处之前的那些代码不能使用它。

                  静态局部变量,在函数里定义,就只能在这个函数里使用,同一个文档中的其他函数也是用不了的。由于被static修饰的变量总是存在内存的

                          静态区。所以即使这个函数运行结束,这个静态变量的值不会被销毁,函数下次使用时仍能使用。

    第二个作用:修饰函数

                  函数前加static使得成为静态函数,但此处的“static”的含义不是指存储,而是只对对函数的作用域仅限于本文件(所以有内部函数)
                 关键字static有着不寻常的历史,起初在C中表示退出一个块后仍然存在的局部变量,之后在C中又有了第二种含义:用来表示被其他
                            文件访问的全局变量和函数。

    [html] view plain copy
    1. <pre name="code" class="html">//关键字static的用法  
    2. #include<stdio.h>  
    3. #include<stdlib.h>  
    4.   
    5. static int n;//定义的静态全局变量      
    6. int   fun1()  
    7. {  
    8.    static int m=0;//静态局部变量  
    9.    m++;  
    10.    return m;  
    11. }  
    12. int  fun2()  
    13. {  
    14.         n=0;  
    15.     n++;  
    16.     return n;  
    17.   
    18. }  
    19. int main()  
    20. {  
    21.     int i;  
    22.     for(i=0;i<10;i++)  
    23.     {  
    24.        fun1();//m为静态局部变量   这个函数运行结束,这个静态变量的值不会被销毁,函数下次使用时仍能使用。  
    25.   
    26.        fun2();//n 静态全局变量 作用于仅限于变量被定义的文件。  
    27.     }  
    28.     printf("m = %d\n",fun1());  
    29.     printf("n = %d\n",fun2());  
    30. system("pause");  
    31. return 0;  
    32. }  

    输出结果:


    展开全文
  • Static静态变量的生存期是整个程序的运行期,它被定义后就一直存在,要保留某个函数的中间结果,就可以用静态变量。 如果static申明的是全局变量,那么这个全局变量只能在这个编译单元(文件)使用,利于模块封装。...

    Static如何使用?

    今天晚上有个姐妹给我发了一道题,题中的代码量不大,但非常考验对Static的用法,如果没有理解清楚,可能就会跟我一样想了半天还是不会。在这里插入图片描述

    Static静态变量的生存期是整个程序的运行期,它被定义后就一直存在,要保留某个函数的中间结果,就可以用静态变量。

    • 如果static申明的是全局变量,那么这个全局变量只能在这个编译单元(文件)使用,利于模块封装。
    • 如果static申明的是局部变量,那么函数返回时将不会释放该变量空间。
    #include<stdio.h>
    int a=4;//全局变量
    int f(int n)
    {
    int t=0;
    static int a=5;//初次声明变,第二次声明不变(自动忽略)(局部变量);
    if(n%2)
    {
    	int a =6;
    	t+=a++;
    } 
    else
    {	
    	int a=7;
    	t+=a++}
    return t+a++;
    int main()
    {
    int s=a,i=0;
    for(;i<2;i++) s+=f(i);//循环两次,总算法为a+f(0)+f(1);
    printf("%d\n",s);
    return 0;
    } 
    

    总算法过程

    首先第一次循环i=0;
    进入f(i)0对2区余为假
    进入else a=7;t=7。
    跳出if语句后a又成为5
    返回值是12.
    此处static int a=6;
    第二次循环i=1;a=6;t=6.
    跳出IF语句后就成t=6+static的这个a(6)
    返回12.
    加起来是24,之后在加上句首定义的int a=4;
    12+12+4=28.

    return t+a++ 等于return t+(a++)
    a应该是static,才有意义

    展开全文
  • C语言静态变量和静态函数 2013-11-26 14:01:37 标签:C语言 static 静态变量和静态函数 http://callmepeanut.blog.51cto.com/7756998/1331737 static C语言  C语言程序可以看成由一...
     C语言静态变量和静态函数
    2013-11-26 14:01:37

    http://callmepeanut.blog.51cto.com/7756998/1331737

    static C语言

          C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。
          由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它(定义外部变量或函数的源文件中也可以包含对该外部变量的extern声明)。
          而static则可以限定变量或函数为静态存储。如果用static限定外部变量与函数,则可以将该对象的作用域限定为被编译源文件的剩余部分。通过static限定外部对象,可以达到隐藏外部对象的目的。因而,static限定的变量或函数不会和同一程序中其它文件中同名的相冲突。如果用static限定内部变量,则该变量从程序一开始就拥有内存,不会随其所在函数的调用和退出而分配和消失。
    C语言中使用静态函数的好处:

    1、静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

    2、关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    c语言中static的语义
    1.static变量:
    1).局部
    a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
    b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
    2).全局
    全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
    2.static函数(也叫内部函数)
    只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数)
         static在c里面可以用来修饰变量,也可以用来修饰函数。
             先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
            int a ;
            main()
            {
                 int b ;
                 int c* = (int *)malloc(sizeof(int));
            }
            a是全局变量,b是栈变量,c是堆变量。
           static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
            static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不在存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。
           static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
          static 声明的变量在C语言中有两方面的特征:
      1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
      2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。


    问题:Static的理解

      关于static变量,请选择下面所有说法正确的内容:

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

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

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

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

    答案与分析:

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

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

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

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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类型,则返回为错指针。


    全局变量以及全局变量与静态变量的关系:

       顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。

       全局变量也可以是静态的,在前面有过说明,静态全局变量的意义就是不让“外部”引用,是单个源文件里的全局变量,即是编译阶段的全局变量,而不是连接阶段的全局变量。


    通过上面的分析,我们不难得出以下结论

    1、 静态函数与普通函数的区别在于:静态函数不可以被同一源文件以外的函数调用。

    2、 静态局部变量与普通局部变量的区别在于:静态局部变量只初始化一次,下一次初始化实际上是依然是上一次的变量;

    3、 静态全局变量与普通全局变量的区别在于:静态全局变量的作用域仅限于所在的源文件。


    来源:http://www.cnblogs.com/wly603/archive/2012/04/11/2442065.html

    展开全文
  • 以下面两个变量a和变量为b进行说明,在编译过程中,发现变量a和b是静态变量,会标识变量a与b,等到程序运行的时候,在主函数调用之前,对变量a和变量b分配空间,并对变量a进行初始化,由于变量b是由函数fun传递的
  • 初学C语言静态变量

    2019-11-25 00:38:57
    在使用 static 关键字修饰变量时,我们称此变量为静态变量静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态...

    静态变量

    在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。

    静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量。

    上面已经阐述过,全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。

    如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件内有效,而在同一源程序的其他源文件中不能使用。这时,就可以通过在全局变量之前加上关键字 static 来实现,使全局变量被定义成为一个静态全局变量。这样就可以避免在其他源文件中引起的错误。也就起到了对其他源文件进行隐藏与隔离错误的作用,有利于模块化程序设计。
    保持变量内容的持久性

    有时候,我们希望函数中局部变量的值在函数调用结束之后不会消失,而仍然保留其原值。即它所占用的存储单元不释放,在下一次调用该函数时,其局部变量的值仍然存在,也就是上一次函数调用结束时的值。这时候,我们就应该将该局部变量用关键字 static 声明为“静态局部变量”。

    当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。

    对某些必须在调用之间保持局部变量的值的子程序而言,静态局部变量是特别重要的。如示例所示,利用静态变量计算1!+2!+3!+4!+…10!的值。

    #include"stdio.h"
    int f(int n)
    {
     static int y=1;
     y=y*n;
     return y; 
    }
    int main()
    {
     int i,s=0;
     for(i=1;i<=10;i++)
      s=s+f(i); 
     printf("%d",s);
     return 0;
    }
    
    
    

    在该代码中,我们通过在 f() 函数里声明一个静态局部变量 y来储存上一次循环调用时y的结果。因为静态局部变量是在编译时赋初值的,且只赋初值一次,在程序运行时它已有初值。以后在每次调用函数时就不再重新赋初值,而是保留上次函数调用结束时的值。这样,f() 函数每次被调用的时候,静态局部变量 y就会保持上一次调用的值,然后再执行运算,这样就实现了数乘和功能。同时,它又避免了使用全局变量。

    通过上面的示例,我们 可以知道静态局部变量一般的使用场景,如下所示:
    需要保留函数上一次调用结束时的值。
    如果初始化后,变量只会被引用而不会改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。

    在静态数据区,内存中所有的字节默认值都是 0x00。静态变量与全局变量也一样,它们都存储在静态数据区中,因此其变量的值默认也为 0。演示示例如下所示。

    #include <stdio.h>
    static int a;
    int b;
    int main(void)
    {
        static int x;
        printf("a:%d\nb:%d\nx:%d",a,b,,x);
        return 0;
    }
    
    
    

    a:0
    b:0
    x:0

    展开全文
  • 浅谈C语言静态关键字static发布时间:2020-07-21 09:33:22来源:亿速云阅读:70作者:小猪小编这次要给大家分享的是浅谈C语言静态关键字static,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇...
  • 在全局变量前加上关键字static,该变量就被定义为静态全局变量。在局部变量前加上关键字static,该变量就被定义成一个静态局部变量。 我们从可见性和生存期这两个方面谈论它们之间的区别。 对全局变量和函数加...
  • C语言静态变量

    2017-07-10 08:19:34
    #include static int a=10; //全局静态变量 void func(); int main(){  while(a--){  func();  }  return 0; } void func(){  static int b=5; //局部静态变量  b++;  pr
  • C语言 静态变量与自动变量的区别

    万次阅读 多人点赞 2017-10-19 13:18:18
    C语言中使用auto 关键字声明自动变量,使用static关键字声明静态变量
  • 定义局部变量的时候加了static静态变量 局部静态变量的初始化语句在第一次执行的时候执行一次,以后再也不执行 存储区别 局部变量是在静态存储区内分配内存单元,在整个程序运行期间都不释放 局部变量的生命周期...
  • C语言静态变量详解

    2019-04-26 20:58:23
    Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static...
  • c语言静态变量和静态函数

    千次阅读 2019-06-24 05:39:30
    static C语言 C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个...
  • c语言静态函数调用静态变量 C中的静态变量 (Static Variables in C) Basically, when static variables are declared, they create only a single copy of them and are also termed as Class Variables. 基本上,...
  • C语言 static静态变量的作用 static c语言的变量种类 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期。 对于局部变量作用域依旧没有改变,...
  • static C语言  C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一...
  • C语言 | static静态变量

    2021-02-19 09:15:02
    例87:学习C语言static定义静态变量的用法。 解题思路:在C语言中,static 不仅可以用来修饰变量,还可以用来修饰函数,使用 static 修饰的变量,称为静态变量静态变量的存储方式与全局变量一样,都是静态存储方式...
  • C语言 static静态变量

    2018-01-01 17:43:00
    静态变量类型说明符是static静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不...

空空如也

空空如也

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

c语言静态变量static

c语言 订阅