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修饰一个函数时,对函数的连接方式产生影响,则这个函数的只能在本文件中调用,不能被其他文件调用。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值