前言
不知道大家在学习static关键字的时候是否对它的用途产生过疑惑。
怎么这个变量怎么就突然使用了static修饰? 究竟是为什么?
本篇小文为大家详细介绍一下这个关键字的用途。
static都可以修饰什么东西?
static修饰的内容有变量和函数。
简单的画个图来表示一下:
我们先看一下修饰的写法:
修饰局部变量和全局变量:
#include <stdio.h>
static int num1 = 0; //修饰局部变量
int main()
{
static int num2 = 0; //修饰全局变量
return 0;
}
修饰函数:
static int Fun()
{
return 0;
}
static修饰局部变量有什么作用?
修饰局部变量
对于一个局部变量而言,出了其所在的作用域,它就会自动销毁,也就是说仅仅在它所在的范围内有效。
#include <stdio.h>
int Fun()
{
int i = 0;
i++;
return i;
}
int main()
{
printf("%d\n", Fun());
printf("%d\n", Fun());
printf("%d\n", Fun());
return 0;
}
此时printf函数可以正常输出局部变量i的值。
输出结果:
1
1
1
对于以上代码的解释是这样的,每进入一次Fun()函数,i的值都会重新创建,Fun()函数执行结束后i的值就会被销毁,所以每次进入Fun()函数,i的值都会被置成0,随后加1跳出。
那被修饰之后呢???
现在我们用static修饰一下i变量
#include <stdio.h>
int Fun()
{
static int i = 0;
i++;
return i;
}
int main()
{
printf("%d\n", Fun());
printf("%d\n", Fun());
printf("%d\n", Fun());
return 0;
}
输出结果
1
2
3
当变量i被static修饰之后,跳出Fun函数后,变量i的值不会销毁,因此每一次执行都会保留i的值。
修饰局部变量后这个变量在底层做出了什么改变?
显而易见的是,局部变量的生命周期变得更长了,这是怎么实现的呢?
其实 在学习C/C++代码的时候,我们通常会把内存的区域划分成三个。
当局部变量被修饰之后,在编译时,就会把这个局部变量规划到静态区,成为静态变量,成为看似全局变量的存在。
被static修饰的局部变量和全局变量有什么区别?
到这里有的小伙伴可能会疑惑,这个被static修饰的局部变量,怎么和全局变量那么像,它们有什么区别呢?
其实,虽然生命周期变长了,但是它的作用域依然是原局部变量的作用域!本质上还是一个局部变量!
何以见得?
还是原来的代码我们进行举例:
#include <stdio.h>
int Fun()
{
static int i = 0;
i++;
return i;
}
int main()
{
Fun();
printf("%d\n", i); //这里printf无法找到i的值,因为从脱离了i的作用域,i的值依然保留但是不可以使用。
return 0;
}
这里printf无法找到i的值,因为从脱离了i的作用域,i的值依然保留但是不可以使用。
static修饰全局变量有什么作用?
在探讨static修饰全局变量有什么作用之前,我想说一下外部连接属性这个概念。
变量的外部连接属性简单来讲就是在一个源文件中定义的变量,可以在其它源文件中使用。
在一个工程中,我们可能会创建多个源文件,如果一个变量具有外部链接属性,那么即便是只在其中一个源文件定义过一次,仍然可以被其他源文件使用,使用时仅需要声明一下即可(在变量前加 extern)。
全局变量就是有外部链接属性的变量。
当全局变量被static修饰时,改变了全局变量的连接属性,它便失去了外部链接属性,仅仅可以在它自己所在的源文件中使用(内部连接属性)。
static修饰函数有什么作用?
static修饰函数其实和修饰全局变量很类似
在一个源文件中创建的函数也可以用在不同的源文件中,和全局变量类似,在其它源文件中使用需要进行声明 。
例如:
extern int Add(int x,int y);
用static修饰后,这个函数就不能在除自己所在源文件以外的源文件中使用。
函数本身具有外部链接属性,但是被static修饰就只有内部链接属性,只能在自己所在的源文件内部使用。
结语
以上就是static关键字在C语言当中的作用啦,可以看出,static关键字更多的是赋予被修饰事物"静态"的属性,修饰局部变量可以改变它的生命周期,使它出了作用域仍然不会被销毁。修饰全局变量和函数,可以改变它们的链接属性,使他们仅仅能在自己所在的源文件中使用。
全局变量和静态变量,在编译时就会被创建,而局部变量是在程序运行的过程中才被创建的,掌握了这些有助于我们更好的理解它们的生命周期。
如果还想了解更多计算机知识,欢迎大家关注我,在以后的日子里,我会经常更新哈