C语言(22)---------->函数(5)
static与extern是面试的高频问点,本文章对此做出介绍。在介绍之前,建议了解变量的作用域与生命周期。
建议参考:
C语言番外篇(5)-------------->作用域与生命周期-CSDN博客
一、static修饰局部变量
static是C语言中的一个关键字,它的中文是静态的,那它到底有什么作用呢?下面我通过两个例子对此进行介绍,希望有助于你对static的理解。
未使用static时:
#include <stdio.h>
void test(void)
{
int a = 1;
a++;
printf("a=%d\n",a);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
运行结果:
原因:a是局部变量,此处进入函数创建,出函数时销毁。
为什么是这样呢?让我们从内存角度进行分析:
再看看反汇编:
使用static时:
#include <stdio.h>
void test(void)
{
static int a = 1;
a++;
printf("a=%d\n", a);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
运行结果:
我们可以发现:使用static之后,a似乎带有了记忆了,能够记住它的值,这是因为此时a出函数时不再销毁。
为什么是这样呢?请看内存:
这个原因是什么呢?
(1)放在静态区的变量的生命周期比较长,和程序的生命周期一样。
(2)static修饰的局部变量本质上影响了变量的存储类型
(3)一个局部变量是存放在栈区的,但是被static修饰之后就存放在静态区了。
(4)因为存储类型的变化,生命周期跟着变化,变长了。
那被static修饰后的变量作用域变化了吗?
作用域是不变的!只能在作用域中使用。
什么时候使用static修饰局部变量呢?
需要积累效果时使用static即可。
二、static修饰全局变量
static修饰全局变量主要用于多文件场景。
未使用static时:
运行结果:
使用static时:
static修饰全局变量时:
(1)全局变量时具有外部链接属性的,在其他文件都可以使用。
(2)全局变量被static修饰之后,外部链接属性就变成了内部链接属性,就是这个全局变量只能在自己所在的.c文件中使用,其他文件时看不到的,本质上是作用域变小了。
三、static修饰函数
static修饰函数时,与修饰全局变量是类似的。
例如:
未使用static修饰时:
使用static修饰时:
static修饰函数时:
(1)函数具有外部链接属性
(2)但是函数被static修饰之后,外部链接属性这个函数只能在自己的.c文件中使用,其他文件即使声明了也不能使用。