C语言中static作用
1,static修饰局部变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
特点如下:
1)存储区:由于栈变为静态存储区rw data,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它;当static修饰局部变量时,可以达到改变局部变量生命周期的目的
啰嗦下(用Static关键字声明后,是变量成为静态的局部变量,即编译时就为变量分配存储单元,直到程序结束时才释放。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)
2)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
参照代码:
代码1:
//===================================
void test()
{
int a=1;//函数调用完之后会被销毁,所以每次打印的都是2;
a++;
printf("%d\n",a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
代码2:
//===================================
void test()
{
static int a=1; //static改变局部变量的生命周期;变量没有被销毁时,不需要被再次定义;
a++;
printf("%d\n",a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
代码1运行结果为:
2 2 2 2 2 2 2 2 2 2 (10个2),函数调用完之后a会被销毁
代码2运行结果为:
2 3 4 5 6 7 8 9 10 11
原因在于static int a=1创建了一个静态的局部变量,使得局部变量a的生命周期变长,上一次的a值仍被保留在作用域内未被销毁,每次循环调用函数test()时,上一次的a值仍被保留在作用域内,不再执行static int a=1代码语句,即不需要对变量a重新初始化。
2,static修饰全局变量
当static修饰全局部变量时,可以达到改变全局变量作用域目的,使得全局变量只能在其被定义的源文件之下被找到。
在全局变量前加static,全局变量就被定义成为一个全局静态变量。
特点如下:
1)存储区:静态存储区没变(静态存储区在整个程序运行期间都存在);
2)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
例如:(参照代码)
在test.c文件中有如下代码段:
extern int g_val; //声明外部变量
int main()
{
printf("%d\n",g_val);
return 0;
}
在add.c文件中定义一个全局变量:
//定义一个全局变量
static int g_val = 2020;
调试运行
static 定义的全局变量即使加了extern也无法编译通过.
3,static修饰函数,和2类似,也是改变了函数的作用域,本质上改变了链接属性。
static修饰函数的作用:函数本身是具有外部链接属性的,但是在static修饰后变成了内部链接属性了,只能在原文件内部里使用,其他文件是无法使用的(编译不过)
总结:
关键字static的作用是什么?在C语言中,关键字static有三个明显的作用:
第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
第二、(考虑到数据的安全性)static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
第三、(考虑到数据的安全性)static修饰一个函数时,对函数的连接方式产生影响,则这个函数的只能在本文件中调用,不能被其他文件调用。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。