栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

  • 修饰局部变量
    来看一段代码
#include 
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 
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修饰时,就具有了内部链接属性,也就只能在自己的源文件内部使用。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号