static是C语言中的一个重要关键字,译为“静态的”,它可以用来修饰局部变量、全局变量和函数。
在了解static的功能之前,先要知道内存简单的构造。
一、内存划分的三个区域:
可以简单的把内存划分成三个区域,分别是栈区、堆区和静态区。
栈区一般放局部变量和形式参数。
堆区一般放与动态内存分配有关的函数,比如malloc函数、calloc函数、realloc函数、free函数等。
静态区一般放全局变量和静态变量。
一个普通的局部变量是放在栈区的。由于栈区的变量是进栈创建,出栈销毁的,所以一个普通的局部变量出了它的作用域就会被销毁。
而静态变量和全局变量是放在静态区的,直到程序运行结束后才被销毁。
二、static修饰局部变量:
当static修饰局部变量时,使得局部变量出了作用域不会销毁,改变了局部变量的生命周期(生命周期延长),但是作用域不变。
#include<stdio.h>
void test1()
{
int a = 1;
a++;
printf("%d ", a);
}
void test2()
{
static int a = 1;//将变量a用static修饰
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
//调用函数
test1();//打印结果为:2 2 2 2 2 2 2 2 2 2
//因为变量a出test函数之后就被销毁了,所以再次进入函数a还是1
i++;
}
printf("\n");
i = 0;
while (i < 10)
{
test2();//打印结果为:2 3 4 5 6 7 8 9 10 11
//用static修饰的局部变量在函数调用之后不会被销毁
i++;
}
}
三、static修饰全局变量:
static修饰全局变量时会将全局变量的外部链接属性变成内部链接属性,导致全局变量只能在自己的.c文件中使用,其他的.c文件中不能使用。
用static修饰的全局变量,作用域缩短,生命周期不受影响。
#include<stdio.h>
//用extern声明外部符号
//该全局变量被定义在add.c文件中
extern int g_val1;
//一个全局变量在整个工程中都可以使用
//引入被static修饰的全局变量
extern int g_val2;
int main()
{
printf("%d\n", g_val1);//打印结果为2023
//printf("%d\n", g_val2);//运行时会报错,无法解析的外部符号g_val2
//这是因为用static修饰的全局变量,使外部链接属性变成内部链接属性
//全局变量是有外部链接属性的,在其他源文件内部只要适当是声明就可以使用
return 0;
}
Add.c文件:
//定义全局变量
int g_val1 = 2023;
//用static修饰
static int g_val2 = 2023;
四、static修饰函数:
static修饰函数时,会将函数的外部链接属性改成内部链接属性,导致函数只能在自己的.c文件中使用,其他.c文件中不能使用。
用static修饰的函数,作用域缩短,生命周期不受影响。
#include<stdio.h>
//定义函数
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);
printf("%d\n", sum);//打印结果为30
//将Add1函数放在Add.c文件中,也是可以编译的,但是会有警告Add1未定义
//声明外部符号
extern int Add1(int x, int y);
int sum1 = Add1(a, b);
printf("%d\n", sum1);//打印结果为30
//用static修饰函数Add2
extern int Add2(int x, int y);
int sum2 = Add2(a, b);
//会报错,因为用static修饰函数后,该函数只能在自己的.c文件中使用
//printf("%d\n", sum2);
return 0;
}
Add.c文件:
//定义函数
int Add1(int x, int y)
{
return x + y;
}
static int Add2(int x, int y)
{
return x + y;
}
总结一下,static可以修饰局部变量、全局变量和函数。
修饰局部变量改变的是变量的存储类型,可以使得局部变量的生命周期延长,作用域不变。
修饰全局变量改变的是变量的链接属性,可以使变量只能在自己的.c文件中使用。
修饰函数改变的是函数的链接属性,可以是函数只能在自己的.c文件中使用。
以上就是我这次分享的内容啦!写的不好,请多担待!