C语言关键字static的那些事儿

首先,来介绍一点背景知识:
计算机内存就是一块存储空间,C语言在内存中进行存储时,内存会被划分成几个不同的功能区域:
①栈区,主要存储的是局部变量以及一些函数的参数。
②堆区,主要是存放我们动态创建的对象,动态申请的临时空间等等。在这里,malloc,free,calloc,realloc这样的函数是比较常见的。
③静态区,又叫全局区,主要以存储全局变量和静态变量为主。
④常量区,一般常量和字符串就是在这里存储。
C语言中,讲究见名知义。关键字static翻译过来就是“静态的”的意思。它在C语言中的作用就主要有下面3个方面:

  • 修饰局部变量
    来看一段代码
#include <stdio.h>
int test()
{ 
	int m = 1;
	m++;
	printf("%d ", m);
	return 0;
}

int main()
{ 
	int a = 0;
	for (a = 0; a <= 5; a++)
		test();
	return 0;
}

在不使用static修饰的情况下,它的运行结果是这样的

2 2 2 2 2 2

而在使用了static关键字的情况下

#include <stdio.h>
int test()
{ 
	static int m = 1;
	m++;
	printf("%d ", m);
	return 0;
}

int main()
{ 
	int a = 0;
	for (a = 0; a <= 5; a++)
		test();
	return 0;
}

它的运行结果是这样的

2 3 4 5 6 7

对比两次的代码及其运行结果,可以发现static的使用使得局部变量即使出了它的作用域也没有被销毁。实际上,这是因为static修饰局部变量改变了变量的存储类型(栈区存储->静态存储),相对于是改变了它的生命周期。

  • 修饰全局变量

test1和test2是同一工程下两个不同的源文件,m在test2中是一个全局变量,在使用其他文件的全局变量时,首先要进行声明,这里使用extern 来声明m这个外部符号。
运行程序,产生错误:

test1.obj : error LNK2001: 无法解析的外部符号 _m

而当不使用static修饰时,程序可以正确运行。这是因为全局变量在整个工程的其他源文件内部可以被使用,就是由于它是具有外部链接属性的。可是,当全局变量被static修饰时,它的外部链接属性就变成了内部链接属性,使得它只能在自己所在的源文件内部使用,可以看做是其作用域变小了

  • 修饰函数
    static修饰函数,实际与修饰全局变量基本一致。函数同样具有外部链接属性,当被static修饰时,就具有了内部链接属性,也就只能在自己的源文件内部使用。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值