前言
static是c语言中比较常用的关键字,具体有三种用法
一、修饰局部变量
二、修饰全局变量
三、修饰函数
下面进行具体讲解
一、修饰局部变量
当static修饰局部变量的时候,会对局部变量的生命周期进行改变
代码示例
- 这里是没有加static的。
#include<stdio.h> void test(){ int a = 10; a = a+2; printf("%d",a); } int main(){ for(int i=0;i<2;i++){ test(); } //printf("%d",a);这里需要注意一下,如此做会失败因为其作用域并没有改变 }
这里printf会输出12和12因为此时a的生命周期在test内,出tset即销毁
- 这里是加了static的。
#include <stdio.h> void test() { static int a = 10; a = a+2; printf("%d",a); } int main(){ for(int i=0;i<2;i++){ test(); } }
这里printf会输出12和14,因为用static修饰局部变量改变了a的生命周期(因为此时a从栈区被改为存储到静态区),此时a的生命周期为整个程序的生命周期,即程序结束才会销毁。
二、修饰全局变量
当static修饰全局变量的时候会改变被修饰变量的外部链接属性为内部连接属性。
代码示例
- 这里是没有加static的。
void test(){ int a = 10; }
文件二)
extern int a; int main(){ printf("%d",a);//程序结果 10 }
此时输出10成功
- 这里是加static的。
(文件一)
void test(){ static int a = 10; }
(文件二)
extern int a; int main(){ printf("%d",a);//程序结果 报错,因为找不到变量a }
此时输出失败,因为static修饰全局变量a使其外部连接属性改为内部链接属性,这就使extern不能链接到a
三、修饰函数
static修饰函数的时候与修饰全局变量类似,会改函数的外部连接属性为内部链接属性。
代码示例
- 这里是没有加static的。
(文件一)
void test(){ int a = 10; printf("%d",a); }
(文件二)
extern void test(); int main(){ test(); }
此时输出10成功
- 这里是加static的。
(文件一)
static void test(){ int a = 10; printf("%d",a); }
(文件二)
extern void test(); int main(){ test();//失败,因为static取消了函数外部链接属性 }
报错,因为extern未能成功链接到test(),static将test的外部链接属性改成了内部链接属性
总结
static可以修饰
一、局部变量(改变生命周期)
二、全局变量(改外部链接属性为内部链接属性)
三、函数(改外部链接属性为内部链接属性)
如有纰漏请各位斧正,如果对你有帮助的话不要忘记点个赞支持一下作者。