精华内容
下载资源
问答
  • c语言static
    千次阅读
    2022-04-21 11:57:22

    static

    [TOC]

     

    1.概述

    static 可以控制变量的储存方式和可见性

    static局部变量在编译阶段分配空间,在程序结束时释放

    静态全局变量不能被其它文件所见,在其他文件中也可以定义同名变量,不会冲突

    可提高程序的模块性,有利于扩展和维护

    改变变量的生命周期

    2.static的作用

    static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,并且自动初始化为0

    2.1 修饰变量

    static修饰的静态局部变量只执行一次初始化,延长该变量的生命周期,程序结束后释放

    2.2 修饰全局变量

    这个全局变量只能在本文本中访问,不能再其他文件中访问

    2.3 修饰函数(静态函数)

    static修饰一个函数,则这个函数只能在本文件中调用,不能被其他文件调用

    3.注意

    不能使用普通变量来初始化静态变量,只能用常量初始化

     

    如:

    int a = 1;

    static int b = a; //错误,a在程序执行后才初始化,b在编译时分配空间

    更多相关内容
  • c语言static

    2021-05-20 05:27:26
    c语言static[编辑]概述static在C语言中是静态存储类型的意思,用static声明的变量在函数调用结束后依然存在,也就是在整个程序中都能用这个变量。c语言:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标...

    c语言static[编辑]

    概述

    static在C语言中是静态存储类型的意思,用static声明的变量在函数调用结束后依然存在,也就是在整个程序中都能用这个变量。

    c语言:

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

    二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

    特点:

    1、C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。

    2、C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。

    3、不同的变量类型可以用结构体(struct)组合在一起。

    4、只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。

    5、部份的变量类型可以转换,例如整型和字符型变量。

    6、通过指针(pointer),C语言可以容易的对存储器进行低级控制。

    7、预编译处理(preprocessor)让C语言的编译更具有弹性。

    static:

    像在VB,C#,C,C++,Java中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的。

    c语言static:

    static声明的变量在c语言中的特征:

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

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

    作用:

    1、隐藏:当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

    2、保持变量内容的持久:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

    3、默认初始化为0:其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。

    总结:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

    static语句的语法包含的部分:

    描述varname必需的。变量的名称;遵循标准变量命名约定。

    subscripts可选的。数组变量的维数;最多可以定义60维的多维数组。

    如果不显式指定lower,则数组的下界由Option Base语句控制。如果没有Option Base语句则下界为 0。

    New可选的。用它可以隐式地创建对象的关键字。如果使用New声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用Set语句来对该对象引用赋值。New关键字不能用来声明任何内部数据类型的变量,也不能用来声明从属对象的实例。

    type 可选的。变量的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、Object、Variant、用户定义类型或对象类型。所声明的每个变量都要有一个单独的 As type 子句。

    static函数内部函数和外部函数:

    当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

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

    使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

    外部函数:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数。

    与dim语句声明的变量的区别:

    static只能在sub或function过程中使用,在退出sub或function过程后变量的值保留;dim使用在sub或function过程中时,退出sub或function过程后变量的值不保留。

    注意:

    Static语句与Static关键字很相似,但是针对不同的效果来使用的。如果使用 Static 关键字来声明一个过程,则该过程中的所有局部变量的存储空间都只分配一次,且这些变量的值在整个程序运行期间都存在。对非静态过程而言,该过程每次被调用时都要为其变量分配存储空间,当该过程结束时都要释放其变量的存储空间。Static语句则用来在非静态的过程中声明特定的变量,以使其在程序运行期间能保持其值。

    在初始化变量时,数值变量被初始化为0,变长的字符串被初始化为一个零长度的字符串,而定长的字符串则用0填充。Variant 变量被初始化为Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。

    如果在过程中使用Static语句,应和其它的声明语句(如Dim)一样将其放在过程的开始。

    参考资料: 百度百科

    扩展阅读:

    相关词条:

    合作编辑:

    分享到:

    更多

    网络营销词典内容均由网友提供,仅供参考。如发现词条内容有问题,请发邮件至info # wm23.com。

    展开全文
  • C语言static关键字的作用
  • C语言static静态变量详解

    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为静态局部变量,用关键字static进行声明。

    通过用static类型声明后的变量,其变量的内存空间位于内存的全局静态区,仅会初始化一次,这是一个非常重要的特性,请大家通过如下的程序理解:

    #include<stdio.h>
    static a=5;
    int fun()
    {
        a=a*2;
        printf("a=%d\n",a);
        return 0;
    }
    int main()
    {
        int i=0;
        for(i=0;i<10;i++)
        {
            fun();
        }
        return 0;
    }

    请大家先自行理解,然后上机运行如上代码,可以观察a的值输出如下:

    a=10
    a=20
    a=40
    a=80
    a=160
    a=320
    a=640
    a=1280
    a=2560
    a=5120
    #include <stdio.h>		//<>所表示的头文件,属于系统包含 
    //#include "max.h" 		//""所表示的头文件,属于用户自己定义 
    
    
    static int g_a=1000; 	//全局变量,从定义的地方开始,到文件结束,所包含的函数都可以使用 
    
    int main()	//有且仅有一个,也成为入口函数, 
    {
    	int m_a=100;			//局部变量
    	prit(m_a);
    //	prit(m_a);
    //	prit(m_a);
    
    //	printf("\n") ;
    //	
    //	printf("m_a=%d\n", m_a);
    //	g_a += 100;
    //	printf("g_a=%d\n", g_a);	
    //    extern g_b;				//声明变量,不开辟空间,声明可以改变作用域 
    //	g_b += 100;
    //	printf("g_a=%d\n", g_b);	
    	return 0; 
    } 
    
    
    static int g_b=1000;	//全局变量,从定义的地方开始,到文件结束,所包含的函数都可以使用 
    //函数之间是平时的,只有调用关系 
    //局部变量全称:局部静态变量 
    void prit(int a)		//局部变量,当函数调用时,才定义变量 
    {
        auto int aa=110;			//局部变量,当函数调用时,才定义变量 
    //	printf("prit_a=%d\n",a);
    //	printf("prit_aa=%d\n",aa);
    	
    //	g_a += 200; 
    //	printf("g_a=%d\n", g_a);
        
    	g_b += 200; 
    	printf("g_a=%d\n", g_b);
    
    //   printf("aa = %d\n", aa);
    //	{	
    //		int aa=100; 	//局部变量,位置是复合语句,块作用域 
    //		printf("aa =%d\n",aa);
    //		
    //	}
    //	printf("aa = %d\n", aa);
    
    //    static int c=1;		//静态局部变量,静态区
    //	c +=5;
    //	printf("a = %d\n",c); 
    	 
    }
    
    
    

    这个结果的原因在于,每次a的值是接着上一次函数调用的值继续运算的,并非每次都初始化从5开始计算,这就是static的特性。

    展开全文
  • 以下是对C语言中的static修饰函数进行了详细的分析介绍,需要的朋友可以过来参考下
  • 主要介绍了C语言 static、extern与指针函数,有需要的朋友可以参考一下
  • static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就staticc语言中的应用进行总结,供参考使用。错漏之...

    概述

    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。

    但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。

    最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。


    在程序中使用static

    变量

    1. 局部变量

    普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

    普通局部变量存储于进程栈空间,使用完毕会立即释放。

    静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

    变量在全局数据区分配内存空间;编译器自动对其初始化
    其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

    小程序体会一下静态局部变量的威力:

    #include <stdio.h>
    
    void fn(void)
    {
        int n = 10;
    
        printf("n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    void fn_static(void)
    {
        static int n = 10;
    
        printf("static n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    int main(void)
    {
        fn();
        printf("--------------------\n");
        fn_static();
        printf("--------------------\n");
        fn();
        printf("--------------------\n");
        fn_static();
    
        return 0;
    }
    

    运行结果如下:

    -> % ./a.out 
    n=10
    n++=11
    --------------------
    static n=10
    n++=11
    --------------------
    n=10
    n++=11
    --------------------
    static n=11
    n++=12
    

    可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

    2. 全局变量

    全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

    普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

    静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

    在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

    函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

    • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    • 不同的文件可以使用相同名字的静态函数,互不影响

    非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    下面两个文件的例子说明使用static声明的函数不能被另一个文件引用:

    /* file1.c */
    #include <stdio.h>
    
    static void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    int main(void)
    {
        fun();
        fun1();
    
        return 0;
    }
    
    /* file2.c */
    #include <stdio.h>
    
    static void fun1(void)
    {
        printf("hello from static fun1.\n");
    }
    

    使用 gcc file1.c file2.c编译时,错误报告如下:

    /tmp/cc2VMzGR.o:在函数‘main’中:
    static_fun.c:(.text+0x20):对‘fun1’未定义的引用
    collect2: error: ld returned 1 exit status
    

    修改文件,不使用static修饰符,可在另一文件中引用该函数:

    /* file1.c */
    #include <stdio.h>
    
    void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    /* file2.c */
    int main(void)
    {
        fun();
    
        return 0;
    }
    

    同样使用 gcc file1.c file2.c编译,编译通过,运行结果如下:

    -> % ./a.out 
    hello from fun.
    
    • 1
    • 2

    面向对象

    静态数据成员

    在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:

    • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
    • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
    • 由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
    • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
    • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
    • 类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

    同全局变量相比,使用静态数据成员有两个优势:

    • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
    • 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能

    静态成员函数

    与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:

    • 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
    • 出现在类体外的函数定义不能指定关键字static
    • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

    总结

    static是一个很有用的关键字,使用得当可以使程序锦上添花。当然,有的公司编码规范明确规定只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格。

    无论如何,要在实际编码时注意自己的编码习惯,尽量体现出语言本身的优雅和编码者的编码素质。

    展开全文
  • 原标题:C语言 static 声明静态变量?大佬原来用它干这事!C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它!高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都是让其对外不...
  • 转自:http://www.pinlue.com/article/2021/02/2120/1311544512216.html
  • c语言static变量初始化

    千次阅读 2020-10-30 11:39:55
    static int value=i++; printf("%d\n",value); } int main() { fun(0); func(1); fun(2); return 0; } 书中写道:程序输出结果为 0 0 0 作者原意是想表明 static int value=i++;是变量value由于static的修饰...
  • 例: 结果是10个6 解析:a++的结果是6,当出了局部变量的作用范围后,局部变量会被... 结果是6到15 static修饰局部变量的时候,局部变量就变成了静态的局部变量,出了局部的范围,不会销毁,下一次进入函数依然存在。
  • c语言static关键字参数

    2020-10-20 13:21:04
    1,static 修饰变量. ① 静态的局部变量; 延长了局部变量的生命周期,static变量只被初始化一次,下一次被调用会由依据这一次的结果值, ②修饰全局变量;...c语言的项目是由多个源文件组成,而每一个源文件 ` ...
  • static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。 代码如下:int a ;int main(){ int b ...
  • static从英文上翻译是静态的意思,在C语言static所起的作用也正是静态。对于局部变量而言,其作用域是局部的如某一子函数体,程序在每次执行时调用该子函数时,其声明的局部变量都会重新赋值。那如果我们想让程序...
  • static的灵活运用, 以及生命周期的改变, 让你写代码由儒生入儒圣
  • 关于C语言static定义函数类型的具体解释 分类? C语言知识2011-08-17 11:34?231人阅读? 评论(0? \o "收藏" 收藏? \o "举报" 举报 ? ? 内部函数和外部函数? 函数一旦定义后就可被其它函数调用 ? 但当一个源程序由多个...
  • C语言static变量详解

    2022-03-06 15:49:05
    在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。 静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是...
  • C语言static关键字的作用(有三个作用)

    千次阅读 多人点赞 2021-07-11 00:33:11
    当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 2.保持变量内容的持久 变量不加 static 修饰: #include <stdio.h> void test() { int num = 0; num++; printf("%d ", ...
  • C语言static的用法

    2013-01-21 16:21:27
    C语言static的用法
  • 深入理解C语言static关键字的三个作用

    千次阅读 多人点赞 2022-04-11 10:34:48
    目录static修饰局部变量static 修饰全局变量static 修饰函数总结 static修饰局部变量 图一:test 函数里面定义的 a 是局部变量,局部变量在栈区上开辟空间,栈区的使用特点是进入变量的生命周期时自动为其开辟空间...
  • C语言 static静态变量

    千次阅读 2018-01-01 17:43:00
    静态变量类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不...
  • **************************C语言中的static的用法******************************** ******************************************************************************* static变量 ( 修饰全局变量 与 局部变量)...
  • c语言static函数声明和函数定义 都在.c文件 都要加static修饰
  • C语言 static静态变量的作用 static c语言的变量种类 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期。 对于局部变量作用域依旧没有改变,...
  • C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是: 一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言。 三是因为存放在静态区...
  • C语言static的使用

    千次阅读 多人点赞 2019-05-10 16:55:13
    C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为...
  • static定义一个变量到底需不需要加上数据类型呢?这里没加也没出错 #include int main() { int i; static a=1; for(i=0;i;i++) a=a+i; printf("%d\n",a); } ![图片说明]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 236,378
精华内容 94,551
关键字:

c语言static