c语言关键字-static
一、static关键字三个作用
定义全局静态变量,定义局部静态变量,定义静态函数
二、c语言中static作用
- 在修身变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期直至程序运行结束才释放。一个被声明为静态的变量在这一函数被调用的过程中维持其值不变
- 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数调用,他是一个本地的全局变量。。另一种说法即:static修饰的全局变量,这个全局变量只能在本文件中被访问,不能在其他文件中访问,即便是使用extern外部声明也不可以
- static修饰一个函数,则这个函数只能在本文件中调用,不能被其他文件调用,static修饰的局部变量存放在全局静态存储区。
(1):不想被释放的时候可以用static修饰。比如修饰函数中存放在栈空间的数组,如果不想让这个数组在函数调用结束释放则可以使用static修饰。
(2):考虑到数据本地化与代码范围的好处时可以使用static。当想要使用全局变量的时候应该优先考虑使用static.
三、static修饰全局变量与普通全局变量区别,static修饰局部变量与普通局部变量区别,static修饰函数与普通函数区别、
- 全局变量加上static就成了静态的全局变量。全局变量本身就是静态存储方式,所以两者在存储方式上没有区别。static全局变量只初始化一次。两者的区别在于,非静态全局变量的作用域是整个源文件,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域即只在定义该文件的原文件中有效,在同一程序的其他源文件下则不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他的源文件中引起错误。
把全局变量改变为静态的全局变量后存储方式没变但改变了它的作用域,限制了他的使用范围。
2.局部变量加static后就变成了静态的局部变量,static局部变量只被初始化一次,在两次函数调用时,第二次调用进入时仍保持第一次调用时退出的值。下一次仍然是上次的结果值,即被声明为静态的局部变量在这一函数被调用的过程中维持其值不变。在函数调用结束后变量不会被销毁,直到程序运行结束static变量才会被回收。所以把局部变量改变为静态的局部变量后改变了它的存储方式,即改变了它的生存期。
把局部变量改为静态的局部变量后存储方式改变了,生存期延长了。普通的局部变量的存储空间都分配在栈区,每次被函数调用时分配的空间可能都不一样,而static局部变量具有全局唯一的特点,每次被调用时都指向同一内存,因此值在函数中不变,变量一直到程序结束才被回收
1.初始化与赋值的区别:
初始化:变量定义的同时给其一个值。
赋值:变量已经存在再给其一个值。
3.函数加上static后,static函数的作用域仅限在本文件,不能被其他文件调用。这个函数被限制在声明它的模块的本地范围内使用。而且static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
四、static函数实例
-
不加static修饰
1 #include <stdio.h> 2 void test() 3 { 4 int num=0; 5 num++; 6 print("%d",num); 7 } 8 int main() 9 { 10 int i=0; 11 for(i=0;i<10;i++) 12 { 13 test(); 14 } 15 return 0; 16 }
运行结果为:1111111111
-
变量被static修饰
#include<stdio.h> void test() { static int num=0; num++; printf("%d",num); } int main() { int i=0; for(i=0;i<10;i++) { test(); } } 运行结果为:12345678910
- 不加static修饰,函数或代码块中的变量在函数或代码块执行完毕后就直接回收销毁了,每次执行都会重新分配内存,每次都会销毁。
- 加static修饰,函数或代码快中的变量在函数或代码块执行第一次初始化并分配内存后,就算函数或代码块执行完毕,该变量也不会被回收销毁,直到程序运行结束static变量才会被回收