c语言static作用是什么,c语言static作用详解
static的作用还是比较强大的。对static关键字深入了解,首先需要掌握标准C程序的组成。
1)正文段:CPU执行的机器指令部分,也就是你的程序。一个程序只有一个副本;只 读,这是为了防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。注意:只有全局变量被分配到数据段中。
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。这句很关键,常常有笔试题会问到什么东西放到栈里面就足以说明。
5)堆——动态存储分配。
在嵌入式C语言当中,它有三个作用:
这样定义的变量称为局部静态变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。也就是上面的作用一中提到的在函数体内定义的变量。除了类型符外,若不加其它关键字修饰,默认都是局部变量。比如以下代码:
1 void test1(void) 2 { 3 unsigned char a; 4 static unsigned char b; 5 ; 6 ; 7 ; 8 a+; b++; 9}
在这个例子中,变量a是局部变量,变量b为局部静态变量。作用一说明了局部静态变量b的 特性:在函数体,一个被声明为静态的变量(也就是局部静态变量)在这一函数被调用过程 中维持其值不变。这句话什么意思呢?若是连续两次调用上面的函数:
1test1: 2 void main(void) 3{ … 4test1(); 5 test1(); 6 … 7}
然后使程序暂停下来,读取a和b的值,你会发现,a=1,b=2。怎么回事呢,每次调用test1 函数,局部变量a都会重新初始化为0x00;然后执行a++;而局部静态变量在调用过程中却能 维持其值不变。
通常利用这个特性可以统计一个函数被调用的次数。 声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时 候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相 关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如 :
1 void count(); int main() 2 { 3 int i; for (i = 1; i <= 3; i++) 4 { count(); 5 { 6 return 0; 7 } 8 } 9 10 } 11 12void count() 13{ 14 static num = 0; 15 num++; 16 printf(" I have been called %d",num,"times\n"); 17}
输出结果为:I have been called 1 times. I have been called 2 times. I have been called 3 times.
看一下局部静态变量的详细特性,注意它的作用域。
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,
除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随
之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中 存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留 在内存当中,直到程序结束,只不过我们不能再对他进行访问。
作用二:在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函 数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
这样定义的变量也称为全局静态变量:在全局变量之前加上关键字static,全局变量就 被定义成为一个全局静态变量。也就是上述作用二中提到的在模块内(但在函数体外)声明 的静态变量。
<1>不会被其他文件所访问,修改,是一个本地的局部变量。
<2>其他文件中可以使用相同名字的变量,不会发生冲突。
全局变量的详细特性,注意作用域,可以和局部静态变量相比较:
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意
的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到
文件结尾。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是 不可见的),但是没有改变它的存放位置,还是在静态存储区中。 作用三:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那 就是,这个函数被限制在声明它的模块的本地范围内使用。
这样定义的函数也成为静态函数:在函数的返回类型前加上关键字static,函数就被定 义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文 件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。它定义一个本地的函数。
这里我一直强调数据和函数的本地化,这对于程序的结构甚至优化都有巨大的好处,更 大的作用是,本地化的数据和函数能给人传递很多有用的信息,能约束数据和函数的作用范 围。在C++的对象和类中非常注重的私有和公共数据/函数其实就是本地和全局数据/函数的 扩展,这也从侧面反应了本地化数据/函数的优势。
最后说一下存储说明符,在标准C语言中,存储说明符有以下几类:auto、register、extern和static 对应两种存储期:自动存储期和静态存储期。auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建 立,它在该程序块活动时存在,退出该程序块时撤销。关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具 有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他 的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在 程序执行到该对象的声明处时被首次初始化。
本文地址:百科问答频道 https://www.neebe.cn/wenda/933224.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!