版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/84229655
### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
static,意为“静止的,静态的”,这是C的5大存储类中的一个常用关键字
如果有一点C源码的阅读经验,通常见到static我们会联想到静态变量,其实这个存储类应该叫做具有代码作用域的静态变量
C语言中,静态变量(static variable)指的是变量的位置固定不动,简单来说就是包含该变量的函数完毕后,变量仍存在
static的作用是:
声明具有代码块作用域的静态变量。
1、static的格式
与auto、extern类似,static被写在数据类型的前面表示声明的是static静态变量(注意extern也可以叫静态变量):
static int count = 1; /* 声明static变量并初始化 */
static int x; /* 与auto不同,static声明的int变量如果没有显式地初始化,系统默认其值为0 */
static char* str = "Barcelona"; /* 声明static的char数组 */
根据用法不同,常见的有静态局部变量和静态全局变量:
static char* str = "Messi"; /* 函数外定义的,叫static全局变量 */
void fun()
{
static int count; /* 函数内定义的,叫static局部变量 */
}
2、全局static和局部static
由上述我们可以简单知道,static的声明位置不同,static变量本身性质也有区别
一般的,全局变量有这样的特点:
/* file.h */
#include <stdio.h>
void fun();
/* file.c */
#include "file.h"
static char* str = "Barcelona"; /* 只在本文件中可见 */
void fun()
{
printf("Champion is %s\n", str);
}
/* file2.c */
#include "file.h"
int main(void)
{
/* printf("%s", str); 如果加上这句,会报错,因为str和main函数不在一个文件 */
fun(); /* 调用fun函数却可以看到显示了str字样,因为fun函数和str在同一文件下 */
return 0;
}
static局部变量本身不存在各个文件之间需要调来调去,但比起常规的auto变量它有这么一个特点:
#include <stdio.h>
void fun()
{
static int count = 1; /* 函数内的一个static局部变量 */
int contrast = 1; /* 函数内的一个auto局部变量 */
printf("count=%d, contrast=%d\n", count++, contrast++);
}
int main(void)
{
fun(); /* 连续调3次fun函数 */
fun();
fun();
return 0;
}
/*
上述程序的结果是:
1, 1
2, 1
3, 1
可见每次调用函数,auto的变量的生存周期与函数是同步的,调用结束即销毁,
但static的局部变量却一直记录着变化值,不随函数而动,这是因为static有自己的存储空间,
auto变量在每次函数被调用的时候都初始化一遍,但static局部变量只有在最初函数被编译的时候初始化一次
*/
——参考《C Primer Plus第五版》
相关文章:
C语言关键字浅析-register