一、简述

static意译是静态的,而作为C语言中常见的关键字之一,它的用法也贴切“静态”这一含义。

二、用法

    • 修饰局部变量

下为static是否修饰局部变量对程序运行结果影响的对比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
void play()
{
int a = 6;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 5)
{
play();
i++;
}
return 0;
}

点击并拖拽以移动

img点击并拖拽以移动编辑

此为上图static未修饰局部变量的运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
void play()
{
static int a = 6;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 5)
{
play();
i++;
}
return 0;
}

点击并拖拽以移动

img点击并拖拽以移动编辑

此为static修饰局部变量的运行结果

由上述的对比观察可得:static修饰局部变量时改变了被修饰(静态局部)变量的生命周期。

我们知道局部变量的生命周期是进作用域开始,出作用域结束,而其作用域是变量所在的局部范围。深入剖析来说,static修饰局部变量时改变了变量的存储类型。将本来存储在栈区的局部变量存放在了静态区。存储类型的改变使得其生命周期变长,但并不影响变量的作用域。

2.修饰全局变量

下为static是否修饰全局变量对程序运行结果影响的对比。

img点击并拖拽以移动编辑

用extern声明外部符号使得在两个文件中可以达到“一次定义,多次声明”的效果。
注意:extern只能用来声明全局变量!

img点击并拖拽以移动编辑

当用static修饰全局变量后,程序报错无法运行。

已知全局变量具有外部链接属性,上图对比分析得:static修饰全局变量之后将其(静态全局变量)外部链接属性变成了内部链接属性。此时的全局变量只能在自己所在的.C文件中使用,对其他文件无法链接使用。即static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。

3.修饰函数

下为static是否修饰全局变量对程序运行结果影响的对比。

img点击并拖拽以移动编辑

img点击并拖拽以移动编辑

此为为被static修饰时程序运行结果

img点击并拖拽以移动编辑

程序报错 无法运行

函数也具有外部链接属性,由上分析可得相同结论:static修饰函数(静态函数)后将其外部链接属性变为内部链接属性,无法链接使用,只可在自己所在.c文件中使用。

三、总结

static修饰局部变量时将其生命周期延长但作用域未发生改变。

static修饰全局变量和函数时将其外部链接属性变为内部链接属性,使其只能在所在文件中使用。

四、补充

以下内容只为简单提到,后续学习过程中会专门做分享探讨。

1.有关C语言内存分区

img点击并拖拽以移动编辑

2.有关C语言三种链接属性

链接属性(linkage)分为三种——外部(external)、内部(internal)、无(none)。

注意:*链接属性的改变不会改变作用域。

*链接属性意味着能不能访问变量及能不能在文件中定义同名变量或函数名。