c语言static的作用中static 函数和普通函数的区别

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也
是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多
个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文
件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数
公用, 因此可以避免在其它源文件中引起错误。
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
C程序一直由下列部分组成:
& & & 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; & &
& 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 & &
& 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 & &&
& 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 & & &
& 5)堆——动态存储分。
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
& &1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
& 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
& &3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
定义全局静态变量的好处:
&1&不会被其他文件所访问,修改
&2&其他文件中可以使用相同名字的变量,不会发生冲突。
局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
& 1)内存中的位置:静态存储区
& 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
& 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
&注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量
在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位
置,还是在静态存储区中。
3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
& 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
&1& 其他文件中可以定义相同名字的函数,不会发生冲突
&2& 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。&
auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该
程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage&
duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静
态局部对象在程序执行到该对象的声明处时被首次初始化。
由于static变量的以上特性,可实现一些特定功能。
1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调
用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。&
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对
函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文
件中的函数同名,因为同名也没有关系。&
c语言中static的语义
1.static变量:
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后,&
尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是
整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程
序的其它源文件中不能使用它。
2.static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可
以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平
时所说的堆栈是栈而不包含对,不要弄混。
本文已收录于以下专栏:
相关文章推荐
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量...
转载:/sunshine_linting/blog/static//
static函数与普通函数
全局变量(外部...
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量...
/sunshine_linting/blog/static//
全局变量(外部变量)的说明之前再冠以sta...
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量...
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
   1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
  2)初始化:未经初始化的全局静态变量会被...
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量...
C程序一直由下列部分组成:
1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,...
转载自一个贴吧大神的回答,很全面认真,所以就放在这方便查看。
原帖地址:http://bbs.csdn.net/topics/(T0Ols大神的回答)
回答如下:
C程序一直由...
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)c语言中static的用法详细示例分析
字体:[ ] 类型:转载 时间:
以下是对c语言中static函数的用法进行了详细的分析介绍,需要的朋友可以过来参考下
static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。 代码如下:int main(){&&& &&& int c* = (int *)malloc(sizeof(int));}a是全局变量,b是栈变量,c是堆变量。static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
文件a.c 代码如下: //只在a文件中用&&&&&&&&& //在工程里用static void init()&&&&&&&& //只在a文件中用{}void callme()&&&&&&&&& //在工程中用{&&&}上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。
文件b.c 代码如下:&&&&&&&&&&&&&&&&&&& //调用a文件里的extern void callme();&& //调用a文件里的int main(){& ...}extern的另外用法是当C和C++混合编程时如果c++调用的是c源文件定义的函数或者变量,那么要加extern来告诉编译器用c方式命名函数:
文件A.cpp调用a.c里面的变量i和函数callme() 代码如下:extern "C"& //在c++文件里调用c文件中的变量{&&&& void callme();}int main(){&& callme();}二 static法则:A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
全局变量有外部、静态两种存储方式。(1)全局变量一般用外部存储方式存储,用保留字extern加以定义。此时,变量的作用域是构成整个程序的所有程序文件,也就是定义的外部变量可供其它程序文件使用。使用这样的全局变量一定要非常慎重,一旦产生错误,将波及整个程序。
(2)如果希望全局变量仅限于本程序文件使用,而其它程序文件中不能引用,这时必须将其存储方式定义为静态存储方式,用保留字static加以定义。此时称为静态外部变量。例如,在上例文件filel.c中,如果作这样的定义:static int a:则变量a的作用域被缩小至本程序文件filel.c,文件file2.c中不能引用。值得注意的是对全局变量加static,定义为静态存储方式,并不意味着是静态存储;而不加static,是动态存储。两种形式的全局变量(外部变量)都是静态存储方式,都是编译时分配存储空间,但作用域不同。使用静态外部变量,有利于隔离错误,有利于模块化程序设计。
(3)全局变量的缺省存储方式是外部存储方式。前面章节中的程序没有见到变量的存储类别定义,实际上采用变量的缺省存储方式。对局部变量采用auto方式,对全局变量采用extern方式。这也是至今为止,我们在程序中没有见到auto、extern等的原因。至此,我们对变量的存储类别及数据类型进行了全面讨论,在此作个小结。
1.变量定义的一般形式存储类别数据类型变量表;
2.变量定义的作用①规定了变量的取值范围。②规定了变量进行的运行操作。③规定了变量的作用域。④规定了变量的存储方式。⑤规定了变量占用的存储空间。
3.局部变量和全局变量从作用域角度将变量分为局部变量和全局变量。它们采取的存储类别如下:
局部变量:①自动变量,即动态局部变量(离开函数,值就消失)。②静态局部变量(离开函数,值仍保留)。③寄存器变量(离开函数,值就消失)。④形式参数可以定义为自动变量或寄存器变量。
全局变量:①静态外部变量(只限本程序文件使用)。②外部变量(即非静态的外部变量,允许其它程序文件引用)。
4.动态存储和静态存储从变量存在时间可将变量存储分为动态存储和静态存储。静态存储是在整个程序运行时都存在,而动态存储则是在调用函数时临时分配存储单元。
动态存储:①自动变量(函数内有效)。②寄存器变量(函数内有效)。③形式参数。
静态存储:①静态局部变量(函数内有效)。②静态外部变量(本程序文件内有效)。③外部变量(整个程序可引用)。
5.静态存储区和动态存储区从变量值存放的位置可将变量存储区分为静态存储区和动态存储区:内存中静态存储区:①静态局部变量。②静态外部变量。③外部变量(可被同一程序其它文件引用)。内存中动态存储区:自动变量和形式参数。CPU中的寄存器:寄存器变量。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具static作用:&改变生命周期& 或者 &改变作用域&
  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
1.作用于变量:
   用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期)。用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。
   用static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时其作用域很广,整个文件都有效甚至别的文件也能引用它。为了限制某些外部变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static关键字对其作出声明。
  总结:用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。
2.作用于函数:
  使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。
  如果想要其他文件可以引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其他文件调用。另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数即可。
const作用: &只读(readonly)&
1.定义常量
修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的,readonly。
TYPE&const&ValueName&=&&&
const&TYPE&ValueName&=&
(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.&
extend&const&int&ValueName&=&
2.指针使用CONST
(1)指针本身是常量不可变
char *&const&pC&&
const&(char*)&pC&
(2)指针所指向的内容是常量不可变
const&char&*pC&&
char&const&*pC&&
(3)两者都不可变
const&char*&const&pC&&
(4)还有其中区别方法,沿着*号划一条线:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
3.函数中使用CONST
(1)const修饰函数参数
a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void&function(const&int&Var);&
b.参数指针所指内容为常量不可变
void&function(const&char*&Var);&&
c.参数指针本身为常量不可变(也无意义,因为char*&Var也是形参)
void&function(char*&const&Var);&
d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void&function(const&Class&&Var);&//引用参数在函数内不可以改变
void&function(const&TYPE&&Var);&//引用参数在函数内为常量不可变
这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用
的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,&然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性,&且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙.
(2)const&修饰函数返回值
const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。
const&int&fun1()&//这个其实无意义,因为参数返回本身就是赋值。
const&int&*&fun2()&//调用时&
const&int&*pValue&=&fun2();&//我们可以把fun2()看作成一个变量,即指针内容不可变。
int*&const&fun3()&//调用时
int&*&const&pValue&=&fun2();&//我们可以把fun2()看作成一个变量,即指针本身不可变。
阅读(...) 评论()首先,C++是C的超集,所以static在C中的用法 对于C++来说是全盘接受的,而两者的不同也就是C++中多出来的特性,而这些多出来的特性与C++面向对象的特性有关,或更具体的说,就是static在&类&中的意义和作用。
1:C语言中的Static使用:
1.1 &C中static变量 的影响其实不在作用域而在于 其&存储方式&:
&&即在函数内定义的static变量,其作用域仍然在函数内;在函数外定义的static变量,其作用域也在函数外,属于变量所在的文件的作用域。
static 的静态存储方式使得:同一函数的所有static变量的&副本&都共用一个该变量。所以使用了static变量的函数一般是&不可再入&的,不是&线程安全&的。
1.2 &C中static函数 的作用:
C中static函数还有另外一个名字,叫:内部函数。从名字也可看出,C中的static函数的定义将函数&局部化&,使其访问权限被限制在当前文件内部,这实际上说明的是一种&代码的隐藏机制&,通过和extern函数(外部函数)的联合使用,可以实现C语言中函数的模块化设计,这有点类似与C++ 中的Public和private关键字的味道。 &当然,如果在C中,函数默认的访问权限是extern的,所以关键字extern往往省略不写。
2: C++类中定义的Static变量和函数
其实本质上与C中的情况一致,不在于作用域(还是类的作用域),而在于其&存储方式&决定了Static变量将与类存储在一起(因为类本身在内存中有其原型的内存空间),而类的实例将共享这一static变量,所以static变量也不是&线程安全&的。
而static成员函数的设置,主要是为了访问静态变量,或者完成某些独立于类实例的功能。
阅读(...) 评论()

我要回帖

更多关于 c语言中static函数 的文章

 

随机推荐