关键词static用于修饰变量和函数
1.修饰局部变量
static修饰局部变量时,改变了局部变量的存储位置,使得局部变量不被销毁,变成了和程序的生命周期一样长。例如:
#include <stdio.h>
int sum(int a)//定义函数sum
{
int c = 0;
static int b = 3;//static修饰整型变量b,第一次循环时b=3,之后b++,b变成4,因为b被static修饰,所以第二次循环时,b=4不被销毁,在第二次循环中b就等于5,同理第三次循环中b=6.
c ++;
b ++;
return (a + b + c);
}
int main()
{
int i;
int a = 2;
for(i = 0;i < 3;i++)//for循环中给i附初值0,i++,当i=3时for循环结束,所以一共执行3次循环,分别是i=0,i=1,i=2时。
{
printf("%d\n",sum(a));//在这里打印的就是当i分别等于0,1,2时函数sum中(a+b+c)的值
}
return 0;
}
运行结果:
在这整个代码中,a和c的值从始至终都没有改变,a=2,c=1。只有b在三次循环中改变了,第一次循环b=4,第二次循环b=5,第三次循环b=6。所以三次循环输出的值(a+b+c)的值分别为7,8,9。
若是整型变量b没有被static修饰,则三次循环的结果为”7 7 7“。因为如果当b没有被static修饰时,第一次循环经过
int b = 3;
得到b=3,再经过
b++;
得到b=4。,然后第一次循环返回值(a+b+c)中b的值就为4。
当第二次循环时,由于b未被static修饰,所以第一次循环所得b=4被销毁,经过
int b = 3;
得到b=3,再经过
b++;
得到b=4。,然后第二次循环返回值(a+b+c)和第一次循环返回值相等都为7,b的值都为4,第三次循环同理。
总的来说,当static修饰一个局部变量时,该局部变量经过第一次循环所得到的值将会保留到第二次循环,第二次循环该局部变量的初始值就用第一次循环所得到的局部变量的值。
2.修饰全局变量
static修饰全局变量时全局变量由外部链接变为内部链接,导致其他源文件无法使用该变量,通俗的讲,就是当有两个源文件时,1号源文件有一个变量a=4,2号源文件可以通过使用关键词extern来引入源文件中的变量a=4,来用于2号源文件,但当1号源文件中的变量a=4被static修饰时,变量a=4就不能被用在2号源文件中。
如上图2.c中的变量g.li就被用在了源文件1.c中,并打印出g.li的值2024。但当2.c中的g.li被static修饰时,1.c中便不能引用变量g.li。
3.修饰函数
修饰函数时同修饰全局变量相同 , static修饰函数时函数由外部链接变为内部链接,导致其他源文件无法使用该函数