C语言,static

术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

  • static变量:

static局部变量:

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,已经被显式初始化的除外)
  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

  当static用来修饰局部变量的时候,

    它就改变了局部变量的存储位置:从原来的栈中存放改为静态存储区。

    改变了初始化方式:static局部变量只被初始化一次,下一次依据上一次结果值。

    改变了生存周期:局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束。

static全局变量:

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
  1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

全局全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。不同之处在于,静态全局变量限制了其作用域,只在定义该变量的源文件内有效。

  • static函数:

只能被本文件中的函数调用。static函数与普通函数的区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.

C语言中使用静态函数的好处:

  不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名;

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

c++:

参考:

1.static的作用 http://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html

2. C/C++中static关键字详解 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

时间: 2024-11-08 18:16:28

C语言,static的相关文章

C语言static 具体分析

google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲手编敲代码验证之. C语言代码是以文件为单位来组织的,在一个源程序的全部源文件里,一个外部变量(注意不是局部变量)或者函数仅仅能在一个源程序中定义一次,假设有反复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和statickeyword. 以下

C语言-- static 全局使用示例

C语言-- static 全局使用示例  前言:看到很多使用Objective-C开发IOS的大牛,有时候会使用static全局变量,相比之下,我却很少用这个,从而很少对其有着比较有实质意义的理解,甚至更别说运用它了. 今天,经过一番思考和自己尝试使用和测试一下static全局变量,发现在有的时候是很有作用的,特此写下笔记. 一开始,我对上面的打印结果有一些疑惑,但是一想到import语句的作用其实就相当于需要导入的文件中的代码拷贝进当前代码import的位置. 然后进一步想到: 备份在百度云的

18-C语言static和extern关键字1-对函数的作用

一.extern与函数 在第三讲和第四讲中,我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问

19-C语言static和extern关键字2-对变量的作用

一.在Java中,全局变量的定义没有严格的位置规定 全局变量可以定义在类的最前面,也可以定义在类的最尾端,也就说一个方法可以访问在它之后定义的变量. 可以看到,第4行定义的test方法可以访问第8行定义的变量a,这是完全没有问题的. 二.在C语言中,全局变量定义的位置是有限制的 默认情况下,一个函数不可以访问在它后面定义的全局变量 在第4行定义的main函数中尝试访问第9行定义的变量a,编译器直接报错了. 解决这个错误的话,有2种办法: 第1种办法:将变量a定义在main函数的前面 这样做编译器

c语言 static的用法

static在c里面可以用来修饰变量,也可以用来修饰函数.先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混.int a ;int main(){    int b ;     int c* = (int *)malloc(sizeof(int));}a是全局变量,b是栈变量,c是堆变量.static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量.有的程序是由好多.c文件构成.彼此可以互相引用变量,但加入static修饰之后

C语言-static(生命周期)

var变量的种类 /* 变量 */ #include <stdio.h> int val1 = 0; //非静态全局变量 static val2 = 0; //静态全局变量 int main() { int val3 = 0; //非静态全局变量 static val4 = 0; //静态全局变量 } static 创建生命周期,因为在变量结束后,内存地址就会被销毁,使用static可以保证下次循环当前数字继续存在 /* 生命周期 */ #include <stdio.h> int

Unity3D研究之多语言用中文做KEY

 做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager不了解的能够看下初探PoolManager插件非常适合新手学习. 说说用中文做KEY的原理:Unity中给文字赋值的地方就两处, 一个是提前预制在UI Prefab上的文字.另一个是写在代码里面的文字.那么在开发阶段我们在Prefab和代码里面直接就写中文,等项目后期通过工具把所有中文的地方所有提取

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

static和extern理解

C语言static修饰函数详细解析(http://www.jb51.net/article/40520.htm) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条.介绍它的第一条也是最重要的一条:隐藏.当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void

Linux下的动态连接库及其实现机制

Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术逐一进行了详细讨论. 本文着重讨论x86体系结构,这是因为 (1)运行Linux的各种体系结构中,以x86最为普及: (2)该体系结构上的Windows操作系统广为人知,由此可以较容易的理解Linux的类似概念: 下表列出了Windows与Linux的近义词,文中将不加以区分: Windows Linux 动