static和extern具有很大的便利性,能够很好的服务于我们代码写作, 下面来简要介绍一下两个关键字的修饰
这里为了方便大家了解两个关键字,先来了解一下两个概念
学习关键字前的三个小概念
全局变量和局部变量
首先来简单说一下全局变量和局部变量的概念吧
我们创建一个变量,如果他的可以应用的范围是整个工程,(作用域是整个工程)那么这个变量就是一个全局变量
同理,如果一个变量应用的范围仅仅是一个工程的一部分,一般是他所在的大括号的范围的话就是局部变量
怎么判断我创建了某个变量是全局变量还是局部的呢?
一般来说,全局变量就是大括号{}外边的一个变量;内部变量就是大括号{}内部的一个变量,我们为了便于展示,直接上图!
#define _CRT_SECURE_NO_WARNINGS int main() { int a = 0; { int b = 0; } return 0; } int c = 0;
同学们先来猜一下哪一个是全局变量哪一个是局部变量?
可能有人说了,a是全局变量,b是局部变量。。。
不对哈,a也在主函数里面哦,有没有同学被我写的代码坑了呢?
a和b都是局部变量,c是全局变量的,记住看他的位置在大括号里面外面哈!!!
作用域
变量的作用域意思就是这个变量哪里可以用它,哪里可以引用这个变量
一般来说全局变量的作用域是整个工程
局部变量的作用域是他所在的那个大括号哈
生命周期
概念
一个人的生命周期是指一个人的出生到死亡,一个变量的生命周期意思是指这个变量在内存中从被创建到销毁,从变量被写入内存到内存被电脑回收,大概就是这个意思
示例
为了大家便于理解,我写一小段代码给大家看一下
#include<stdio.h> void test() { int a = 0; a++; printf("%d", a); } int main() { int i = 0; for (i = 0; i < 5; i++) { test(); } return 0; }
行了,同学门猜一下代码运行结果是几?
答案放文章结尾,看到这里的同学们可以滑下去看一下
我估计很多同学可能要说了,这简单,12345
不愧是你啊,猜错了哈
为啥呢?
a是一个局部变量,每次进入test()函数中,a的声明开始,到达大括号之后,a的生命结束,下次循环进来的时候又是一个新的a。。。没想到吧?
static的用法:
总体来说,static大概有三种用法:
修饰局部变量
static+局部变量效果:被修饰的变量的生命周期变长了,跟全局变量的生命周期一样
本质:static改变了局部变量的存储类型,原来局部变量放在栈区的,不过被修饰之后放在了静态区,跟全局变量成了一个地方
修饰示例:
#include<stdio.h> void test() { static int a = 0; a++; printf("%d", a); } int main() { int i = 0; for (i = 0; i < 5; i++) { test(); } return 0; }
看一下结果:
使用建议:未来如果我们的局部变量出了大括号我们还想保留他的值,我们可以用static来修饰
修饰全局变量
static+全局变量效果:全局变量被修饰后,一个全局变量不能在同一个工程的其他源文件中使用
本质:全局变量具有外部链接属性,当我们用static修饰之后全局变量的外部链接属性就变成了内部链接属性
示例:
一般来说,全局变量是可以在同一个工程中随意使用的,只需要声明就好
运行结果是2023就不看了
但是但是但是我如果给全局变量a加了static
你看看
直接报错,原因是无法解析外部命令,翻译成人话就是说printf函数在调用全局变量a的时候发现找不到了
使用建议:如果一个全局变量,你只想在本源文件中使用,不想被引用到其他源文件中,那么你可以在全局变量前面加一个static来进行修饰
修饰函数
extern的用法:声明外部符号
效果:可以引用来自外部的一些变量声明
本质:链接作用
示例:
使用建议:当你在a文件中定义了某一个全局变量,b文件也想用那么可以使用extern来进行引用
隐藏的答案:
答案:11111