目录
static
可用在局部变量 全局变量 函数
1.局部变量
void test()//进函数a生命周期开始
{
int a = 1;//a局部变量,再进来a还是1,循环往复
a++;//2
printf("%d", a);//2222222222
}//出函数a就销毁了还给操作系统
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
#include <stdio.h>
int sum(int a)
{
int c = 0;
static int b = 3;
c += 1;
b += 2;
return (a + b + c);
}
int main()
{
int i;
int a = 2;
for (i = 0; i < 5; i++)
{
printf("%d,", sum(a));
}
}
a是main函数里开辟的局部变量,c是sum里面的局部变量,在出sum中就会销毁,而b是被static修饰的静态变量,不会因为出sum就销毁,
static修饰局部变量,改变了变量的储存类型,所以这个变量就失去了局部变量的特性,(栈区->静态区)使得静态的局部变量出了自己的作用域也不会销毁,相当于改变了他的生命周期
a | b | c | |
0 | 2 | 5 | 1 |
1 | 2 | 7 | 1 |
2 | 2 | 9 | 1 |
3 | 2 | 11 | 1 |
4 | 2 | 13 | 1 |
结果是8 10 12 14 16
void test()
{
static int a = 1;//上一次出的时候a没有销毁,可以根据结果推测,每一次调用test函数使用的a是上一次留下的,
a++;//2
printf("%d", a);//234567891011
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
在另一个文件定义的变量不能直接使用,要声明
extern int g;//使用之前声明,extern是一个关键字,专门用来声名外部符号的
static修饰全局变量,
一个全局变量在整个过程的其他文件内部使用,是因为全局变量具有外部链接属性,当一个全局变量被static修饰的时候,整个变量
当一个全局变量被static修饰的时候,整个变量就变成了内部链接属性,使得全局变量只能在自己所在的源文件内部使用,其他文件不能用,
static int g = 10;
在另一个文件定义的变量不能直接使用,要声明
test.c
#include<stdio.h>
extern int g;//使用之前声明,extern是一个关键字,专门用来声名外部符号的
int main()
{
printf("%d", g);//10
return 0;
}
g是main.c另一个文件中定义的全局变量
int g=10;
同理修饰函数和修饰全局变量也是一样的
extern int add(int a, int b);
int main()
{
int a = 10, b = 20;
add(a, b);
return 0;
}
//test.c里面的
int add(int a, int b)
{
return a + b;
}
define定义宏
//定义宏
#define add(a,b)((x)+(y))
int main()
{
int a = 10, b = 20;
add(a, b);
return 0;
}