在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。
1、定义局部静态变量
普通局部变量存储于进程栈空间,使用完毕会立即释放。
静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
特点:
- 变量在全局数据区分配内存空间;它始终驻留在全局数据区,直到程序运行结束。
- 即使在声明时未赋初值,编译器也会把它初始化为0。
- 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
例子:
#include <stdio.h>
#include <stdlib.h>
void test1()
{
int m = 0;
m = m + 1;
printf("%d",m);
}
void test2()
{
static int n = 0;
n = n + 1;
printf("%d",n);
}
int main()
{
int i = 0;
int j = 0;
while(i<6)
{
test1();
i++;
}
printf("\n");
while(j<6)
{
test2();
j++;
}
printf("\n");
system("pause");
return 0;
}
运行结果:
2、定义全局静态变量
普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
特点:
- 全局区分配内存,如果没有初始化,其默认值为0.
- 该变量在本文件内从定义开始到文件结束可见。
例子:
int x=100;//全局变量
#include <stdio.h>
extern x;//extern 用来声明外部命令
int main()
{
printf("%d\n", x);
return 0;
}
结果:
static修饰全局变量
static int x = 100;
#include <stdio.h>
#include <stdlib.h>
extern x;
int main()
{
printf("%d\n",x);
return 0;
}
结果:
错误信息为:第一条警告 全局变量 ‘x’ 定义但未被使用 ,第二条错误为 未定义对 ‘x’ 的引用
一个全局变量具有外部链接属性的 (就是可以被其他源文件引用)但是被static 修饰后外部链接属性就变成了内部链接属性 只能在自己所在的源文件内部使用不能在其他文件内部使用。
3、定义静态函数
函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响
- 非静态函数可以在另一个文件中直接引用
例子:
//a.c
void fun()
{
printf("hello \n");
}
//main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
fun();
return 0;
}
结果:
加static修饰 fun()函数
//a.c
static void fun()
{
printf("hello \n");
}
//main.c
#include <stdio.h>
#include <stdlib.h>
extern fun();
int main()
{
fun();
return 0;
}
结果:
总结:
static有什么用途?
1、限制变量的作用域(static全局变量)
2、设置变量的存储域(static局部变量)
- 在函数体,只会被初始化一次,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
- 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。(只能被当前文件使用)
- 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。(只能被当前文件使用)
在C语言中,为什么static变量只初始化一次?
对于所有的对象〈不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆"功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。存放在静态区的变量的生命周期一般比较长,它与整个程序"同生死.共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。