全局变量和局部变量:在函数内部定义的变量是局部变量,在函数外部定义的变量是全局变量
作用域和生命周期的概念:
作用域:程序中标识符可以被使用的区域(范围),局部变量的作用域是它所在的局部范围,全局变量的作用域是整个工程
生命周期:变量由创建到销毁的一个时间段,局部变量生命周期由进入它的作用域开始到出了它的作用域结束,全局变量的生命周期是整个程序的生命周期
1.static修饰局部变量
代码1:
#include <stdio.h>
void test()
{
int val = 0;
val += 1;
printf("%d ", val);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
代码2:
#include <stdio.h>
void test()
{
static int val = 0;
val += 1;
printf("%d ", val);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
代码1中val是局部变量,储存于栈区中,作用域是test函数内部,生命周期在出了这个函数时就结束了,因此每次调用test函数,都会重新定义val变量
代码2中val也是局部变量,作用域依然是test函数内部,但由于static修饰,储存在静态区而非占去中,它的生命周期被改变了,即使出了函数,val依然存在
2.static修饰全局变量
代码1:
val.c文件
int val = 5;
test.c文件
#include<stdio.h>
extern int val;
int main()
{
printf("%d", val);
return 0;
}
代码2:
val.c文件
static int val = 5;
test.c文件
#include<stdio.h>
extern int val;
int main()
{
printf("%d", val);
return 0;
}
程序报错
代码1中val是全局变量,储存于静态区中,作用域是整个工程,生命周期是整个程序的生命周期,在其它源文件使用时需要extern声明
代码1中val是全局变量,由于被static修饰,作用域变为定义全局变量的源文件,本质上是将全局变量由外部链接属性变为内部链接属性,这时全局变量只能在本源文件使用,不允许从其他源文件访问
3.static修饰全局函数
代码1:
Add.c
int Add(int x, int y)
{
return x + y;
}
test.c
#include<stdio.h>
extern int Add(int, int);
int main()
{
int n1 = 1;
int n2 = 2;
int ret = Add(n1, n2);
printf("%d", ret);
return 0;
}
代码2:
Add.c
static int Add(int x, int y)
{
return x + y;
}
test.c
#include<stdio.h>
extern int Add(int, int);
int main()
{
int n1 = 1;
int n2 = 2;
int ret = Add(n1, n2);
printf("%d", ret);
return 0;
}
static修饰函数与修饰全局变量类似,函数具有外部链接属性,但被static修饰后,外部链接属性变为了内部链接属性,只能被本源文件使用,不允许其他源文件访问