static关键字

38 阅读2分钟

static关键字的作用:

  1. 修饰局部变量
  2. 修饰全局变量
  3. 修饰函数

1.static修饰局部变量: 代码1:

#include <stdio.h>

void test()
{
    int i = 0;
    i++;
    printf("%d ", i);
}

int main()
{
    int i = 0;
    for(i=0; i < 5; i++)
    {
        test();
    }
    return 0;
}

运行结果:

image.png

代码2:

#include <stdio.h>

void test()
{
    static int i = 0;
    i++;
    printf("%d ", i);
}

int main()
{
    int i = 0;
    for(i=0; i < 5; i++)
    {
        test();
    }
    return 0;
}

运行结果:

image.png

局部变量的特点是:

  • 进入函数局部变量被创建
  • 函数结束局部变量被销毁

所以在代码 1 中的值并没有被累加。但是代码 2 种 static 修饰的局部变量进行了累加,意味着静态局部变量的生命周期变长了,并不局限于函数的开始创建,函数的结束而销毁。生命周期改变为在程序结束的时候该变量才会被销毁。

2.static修饰全局变量:

#include <stdio.h>

extern int g_val;

int main(){
	printf("%d\n",g_val);
	return 0;
}
#define _CRT_SECURS_NO_WARNINGS

int g_val = 10;

运行结果:

image.png

当以上代码加入static关键字后:

#define _CRT_SECURS_NO_WARNINGS

static int g_val = 10;

运行结果发生报错。 主要原因:被static修饰的全局变量,只能在当前源文件当中使用。简而言之,降低了该全局变量的可见性。

3.static修饰函数:

#include <stdio.h>

extern int g_val;
extern int Add(int x,int y);

int main(){
	int ret = Add(1,2);
	printf("%d\n",ret);
	return 0;
}
#define _CRT_SECURS_NO_WARNINGS

static int g_val = 10;

int Add(int x,int y){
	return x + y;
}

运行结果:

image.png

当以上代码加入static关键字后:

#define _CRT_SECURS_NO_WARNINGS

static int g_val = 10;

static int Add(int x,int y){
	return x + y;
}

运行结果发生报错。 主要原因:被static修饰的全局变量,只能在当前源文件当中使用。简而言之,降低了该全局变量的可见性。