目录
static关键字与extern关键字
static和extern都是C语言中的关键字。
static是静态的意思,它的作用有:
1.修饰局部变量。
2.修饰全局变量。
3.修饰函数。
extern:用来声明外部符号。
作用域与生命周期
在讲解static和extern之前讲解一下:作用域和生命周期。
作用域(scope):
通常来说,一段程序代码中所用到的变量名并不总是有效(可用)的,作用域就是这个变量名有效的代码范围。
1.局部变量的作用域是变量所在的局部范围(所在函数的范围)。
2.全局变量的作用则是整个项目。
#include<stdio.h>
int main()
{
int a=0;//我们在main函数里定义一个变量a,那么a的作用域就是它所在main函数的范围。
return 0;
}
🔺:我们在main函数里定义一个变量a,那么变量a就是一个局部变量,局部变量a的作用域是它所在main函数的范围。
#include<stdio.h>
int b = 0;//我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。
int main()
{
int a=0;//我们在main函数里定义一个变量a,那么a的作用域就是它所在main函数的范围。
return 0;
}
🔺:我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。
生命周期 :
生命周期指的是变量的创建(申请内存)到变量的销毁(回收内存)之间的一个时间段。
1.局部变量的生命周期是:进入作用域变量创建时生命周期开始,出作用域变量销毁时生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。
#include<stdio.h>
int b = 0;//我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。
int main()
{
int a=0;//变量a的生命周期由此处开始:变量a被创建(申请内存)。
return 0;
} //变量a的生命周期从此处结束:main()函数结束,变量a被系统销毁(回收内存)。
🔺:局部变量a的生命周期从它被创建(申请内存)开始,到它所在的main函数结束(回收内存)为止。
🔺:全局变量b的生命周期与整个程序的生命周期一样长,即它的生命周期从整个程序开始运行时开始,整个程序结束运行时结束。
static修饰局部变量:
static修饰局部变量:本质上影响了变量的存储类型,一个局部变量是存储在栈区的,但是被static修饰后就存储在静态区了,因为存储类型的变化,生命周期就跟着变化了。
但是其作用域不变,仍为所在函数的范围。
下面用一段代码作为例子方便大家进行理解:
#include<stdio.h>
void test()
{
int k = 1;
k++;
printf("%d ", k);
}
int main()
{
int i = 0;
for(i=0;i<5;i++)
{
test();
}
return 0;
}
代码运行结果如下:
为什么运行结果是2 2 2 2 2呢,因为变量k是局部变量,它的作用域在test所在的范围内,我们在main函数里调用test函数时每调用一次,k就会被创建一次,同样的在test函数结束时,k变量随即被销毁,下次进入循环时k又被创建,所以每次输出的k值都为2。
下面我们用static关键字修饰局部变量k:
#include<stdio.h>
void test()
{
static int k = 1;\\使用static修饰局部变量k
k++;
printf("%d ", k);
}
int main()
{
int i = 0;
for(i=0;i<5;i++)
{
test();
}
return 0;
}
代码运行结果如下:
结果为2 3 4 5 6,因为我们使用static修饰局部变量k改变了它的生命周期,此时变量k存储在静态区而非栈区,它的生命周期和程序一样长,因此在test函数结束时,局部变量k不会被系统销毁,所以经过五次循环它的值依次增加,最终结果为2 3 4 5 6。
static修饰全局变量:
首先我们要知道全局变量是具有 外部链接属性 的
全局变量被static修饰后,它的外部链接属性就变成内部链接属性,即这个全局变量只能在自己的.c文件内被使用,其他文件看不到也无法使用,相当于作用域缩小了。
下面用一个例子来帮助大家理解:
🔺:我们在test.c文件中定义一个全局变量val,在practice.c文件中使用extern进行外部声明后打印出val的值,程序成功运行并打印出val的值0,这便是全局变量的外部链接属性,即可以被其他文件使用(需要进行extern外部声明后使用)。
接下来我们使用static关键字修饰全局变量val:
🔺:当我们使用static修饰后,运行程序会发现程序报错,error:无法解析的外部符号val,这就是上面提到的,使用static修饰全局变量会将其外部链接属性变为内部链接属性,全局变量val的作用域被缩小了。
static修饰函数:
函数与全局变量一样具有外部链接属性
与全局变量一样,函数被static修饰后,外部链接属性就变成了内部链接属性,其作用域被缩小,这个函数只能在自己所在的.c文件中使用,在其他文件中即使声明了也无法使用。
由于static修饰函数与修饰局部变量一样,因此不再举例。