C语言 关键字static修饰变量和函数 -- 静态变量,静态函数

关键字static修饰变量和函数

在C语言中,static关键字可以用来修饰变量和函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。
修饰局部变量—静态局部变量
修饰全局变量—静态全局变量
修饰函数—静态函数

作用域:程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效的/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域:变量所在的局部范围。
2.全局变量的作用域:整个工程。
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。

static修饰局部变量

代码1:

#include <stdio.h>
void add()
{
	int num = 0;
	num ++;
	printf("%d\n",num);
}
int main()
{
	int i;
	for(i = 0; i < 5; i ++)
	{
	    add();
	}
	return 0;
}

输出:

1
1
1
1
1
请按任意键继续. . .

代码1中num为在add()函数内部定义的局部变量,作用域为add()函数内部,生命周期一次为add()函数运行期间。main()函数每调用一次add()函数,num = 0;调用结束局部变量num的生命周期也就结束了。 下次调用add()函数时,局部变量num又从赋值为0开始。所以每次打印出来的值都是一样的。

代码2:

#include <stdio.h>
void add()
{
    //static修饰局部变量
	static int num = 0;//局部变量定义时前面加上static关键字
	num ++;
	printf("%d\n",num);
}
int main()
{
	int i;
	for(i = 0; i < 5; i ++)
	{
	    add();
	}
	return 0;
}

输出:

1
2
3
4
5
请按任意键继续. . .

代码2中在add()函数内部的局部变量num用static关键字修饰。static修饰的局部变量num变成了静态局部变量。static修饰局部变量改变了变量的生命周期,(局部变量的作用域没变),让静态局部变量出了作用域依然存在,到程序结束生命周期才结束。生命周期变为整个程序运行期间。所以每一次调用add()函数都是在之前的变量num的基础上操作。所以;输出的结果是num累加1。

结论:
static修饰局部变量改变了变量的生命周期,(局部变量的作用域没变),让静态局部变量出了作用域依然存在,到程序结束生命周期才结束。生命周期变为整个程序运行期间。

修饰全局变量

在add.c 和test.c两个源文件中
代码1:

//add.c中

int val = 2020//test.c中

#include <stdio.h>
extern int val;//没有extern声明全局变量val编译失败。 error C2065: “val”: 未声明的标识符
int main()
{
	printf("%d\n",val);
	return 0;
}

输出:

2020
请按任意键继续. . .

说明全局变量用extern声明之后可以在整个工程里使用。
代码2:

//add.c中

static nt val = 2020;

//test.c中

#include <stdio.h>
extern int val;//用extern声明也不可以
int main()
{
	printf("%d\n",val);
	return 0;
}

全局变量val被static修饰后,编译失败,发生错误error LNK2001: 无法解析的外部符号 _val。程序编译时出现了连接性错误。全局变量val被static修饰后,作用域改变了。

结论:
一个全局变量被关键字static修饰,改变了变量可见性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

修饰函数

和全局变量一样,函数可以在整个工程内使用。
在add.c 和test.c两个源文件中
代码1:

//在add.c中

int Add(int a, int b)
{
	return a+b;
}
//在test.c中

#include <stdio.h>
extern int Add (int a, int b);//extern声明外部函数
int main ()
{
	printf("%d\n",Add(2, 3));
	return 0;
}

输出:

5
请按任意键继续. . .

说明函数用extern声明之后可以在整个工程里使用。
代码2:

//在add.c中

static int Add(int a, int b)
{
	return a+b;
}
//在test.c中

#include <stdio.h>
extern int Add (int a, int b);//extern声明外部函数
int main ()
{
	printf("%d\n",Add(2, 3));
	return 0;
}

Add函数被关键字static后和全局变量一样会发生修饰编译错误,error LNK2001: 无法解析的外部符号 _Add。程序编译时出现了连接性错误。函数被static修饰后,函数的作用域改变了。

结论:
一个函数被关键字static修饰,改变了函数可见性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值