c语⾔中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语言和c++区别
c语⾔中static的语义1.static变量:1).局部a.静态局部变量在函数内定义,⽣存期为整个源程序,但作⽤域与⾃动变量相同,只能在定义该变量的函数内使⽤。退出该函数后,尽管该变量还继续存在,但不能使⽤它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统⾃动赋予0值。⽽对⾃动变量不赋初值,则其值是不定的。2).全局全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。但是他们的作⽤域,⾮静态全局变量的作⽤域是整个源程序(多个源⽂件可以共同使⽤);⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。2.static函数(也叫内部函数)只能被本⽂件中的函数调⽤,⽽不能被同⼀程序其它⽂件中的函数调⽤。区别于⼀般的⾮静态函数(外部函数) static在c⾥⾯可以⽤来修饰变量,也可以⽤来修饰函数。先看⽤来修饰变量的时候。变量在c⾥⾯可分为存在全局数据区、栈和堆⾥。其实我们平时所说的堆栈是栈⽽不包含堆,不要弄混。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论