C语言基础学习 -- static关键字作用

static关键字

主要有三个作用:
  1. 用static修饰的变量,与普通的全局变量一样,存储在全局数据区,系统为其分配存储内存,即使作为局部变量,也可保持其值不变;
  2. 用static修饰的变量,只可作用与当前文件,即使同一工程下的其他文件,也不可访问;
  3. 用static修饰的函数,同样只作用与当前文件。

关于1、2点,说白了,就是若static修饰局部变量,即修改了局部变量的生存期,可以像全局变量一样保存其值。 若修饰全局变量,则改变了其作用域,仅限于当前文件。

关于2、3点,这样做的好处就是即使不同文件起同样的名字,只要用static修饰就互不影响,可以防止不必要的错误。

若想了解详细,可参考大神文章:https://blog.csdn.net/guotianqing/article/details/79828100

举例:
  · 其值可保持不变

void func1(void)
{
    int i = 10;
    static int j = 10;
    i++;
    j++;
    printf("普通局部变量值为:%d, static修饰的静态变量值为:%d\n", i, j);
}


int main(int argc, char* argv[])
{
    func1();
    func1();
    func1();
    return 0;
}
运行结果:
	普通局部变量值为:11, static修饰的静态变量值为:11
	普通局部变量值为:11, static修饰的静态变量值为:12
	普通局部变量值为:11, static修饰的静态变量值为:13

可以看出,普通局部变量每次运行其函数时都会初始化,而static修饰的局部变量就会把其值保存下来,下次运行函数时,就会拿上次的值参与运算。

  · static修饰的变量仅作用于当前文件

main.c文件:
	int i;
	static int j;
	
	int main(int argc, char* argv[])
	{
	    test();
	    return 0;
	}

test.c文件:
	extern i;	//extern:调用其他文件变量
	extern j;
	void test(void)
	{
	    i = 12;
	    j = 13;
	    printf("i value %d, j value %d\n", i, j);
	}

运行后出现报错:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK2001	无法解析的外部符号 _j	volatile	D:\Visual studio code\C\volatile\volatile\test.obj	1	
错误	LNK1120	1 个无法解析的外部命令	volatile	D:\Visual studio code\C\volatile\Debug\volatile.exe	1	

当取消j调用时,程序可正常运行:

extern i;
void test(void)
{
    i = 12;
    printf("i value %d\n", i);
}

结果:
i value 12

  ·static修饰函数只作用于当前文件

main.c文件:
	int main(int argc, char* argv[])
	{
	    test();
	    test1();
	    return 0;
	}

test.c文件:
	void test(void)
	{
	    printf("Hello World\n");
	}
	
	static void test1(void)
	{
	    printf("Hello Kitty\n");
	}

test.h文件:
	#ifndef __TEST_H
	#define __TEST_H
	
	void test(void);	//用于让其他文件调用该函数
	void test1(void);
	
	#endif

运行结果:无法解析test1函数

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK1120	1 个无法解析的外部命令	volatile	D:\Visual studio code\C\volatile\Debug\volatile.exe	1	
错误	LNK2019	无法解析的外部符号 _test1,函数 _main 中引用了该符号	volatile	D:\Visual studio code\C\volatile\volatile\main.obj	1	

去掉该函数后即正常:

main.c修改:
	int main(int argc, char* argv[])
	{
	    test();
	    //test1();
	    return 0;
	}

运行结果:
	Hello Wolrd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值