C语言关键字浅析-static

版权声明:本文为博主原创文章,未经博主允许不得转载。 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语言关键字浅析-auto

C语言关键字浅析-extern

C语言关键字浅析-register

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/84229655
今日推荐