C语⾔之static、extern的作⽤
⼀、变量的范围和⽣命期
1.全局变量
变量在(包括⾃定义函数和main函数)外定义/声明,作⽤范围:本⽂件。
2.局部变量
在函数内定义的(包括形参),作⽤范围:所在函数内。
注: 全局变量和局部变量同名,(在局部所在范围内)全局则被屏蔽(以局部为准)
局部变量和局部变量同名(不影响)
⼆、变量的存储⽅式和⽣命期
存储⽅式分为静态存储和动态存储:
1.静态存储:运⾏期间由系统分配的固定的存储空间 (全局变量,static变量)
static修饰的变量2.动态存储:运⾏期间根据需要进⾏动态分配存储空间,⽤完之后释放这些空间 (形参和auto)
存储类别auto static register extern:
1. auto(⾃动变量)在局部内使⽤,函数调⽤完结束则释放内存(不写为默认auto)
2. static(静态局部变量)函数调⽤结束后不释放内存,保留值。只赋⼀次值,赋初值的语句只调⽤⼀次。不赋值的话,系统根据不⼀样
的类型,⽽默认赋值,数值型0,字符型为’\0 ’。
3. register(寄存器变量)局部变量使⽤频繁,可以⽤register,意思是把变量放在CPU中的寄存器中,运算时可以更快的取到这个
值,⽽不⽤去内存中取值
4. extern(外部变量,也叫全局变量)可以跨⽂件使⽤。
注: static修饰的外部变量(即静态外部变量)只可以在本⽂件范围内使⽤,不写为默认extern。
三、变量的声明和定义
1.定义包括了声明
2.声明不占⽤内存,定义变量,系统才会分配内存
3.声明类似于告诉编译器程序中有这么⼀个变量名字,⽽定义才会真正分配内存,如extern告诉编译器变量在其他地⽅定义:
extern int i;//声明,不是定义,不分配内存
int i;//声明,也是定义,未初始化,分配内存
但是如果声明有初始化式,就会被当作定义,即使前⾯加了extern。
只有当extern声明位于函数外部时,才可以被初始化。
例如:
extern double pi=3.141592654;//定义,分配内存
如果pi在其他⽂件⾥被定义了,那么上⾯的定义会报重复定义的错误。
四、函数
1.内部函数(范围只在本⽂件中)
函数定义时,加上⼀个static,如:static void print() {printf("Hello world”);}
2.外部函数(可以被外部⽂件引⽤)
函数定义时,加上⼀个extern(或者不写默认extern) 例如:extern void print() {printf(“Hello world”);}。在其他⽂件引进这个函数的⽅式,只加上:extern 函数声明
五、总结
如果全局变量、函数前⾯没有⽤static修饰的话,默认就是extern,就可以跨⽂件使⽤。
谢谢阅读。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论