static、auto、register、extern
2016-03-12 12:55
204 查看
变量从作用域角度观察,可分为全局变量和局部变量,而从变量存在时间来观察则分为静态存储方式和动态存储方式。
静态存储区 :全局变量
动态存储区:函数形式参数、函数中定义的没有static关键字的声明变量、函数调用时的现场保护和返回地址
静态的、
寄存器、
外部的、
在一个文件内
我们在main函数下边申请了一个变量A,按照从上到下的顺序,我们不能够在main函数里面调用变量A,但引入extern关键字我们就可以实现。
在两个文件间
file1文件
file2文件
倘若我们不想让别的文件引入我们的变量我们可以在变量前面加上static,这样就不会出现两个文件间进行互用一个变量了。
(2)对于全局变量用static声明,作用是让变量作用域只限于本文件模块中
内存中供用户使用的存储空间可分为三部分:
程序区静态存储区 :全局变量
动态存储区:函数形式参数、函数中定义的没有static关键字的声明变量、函数调用时的现场保护和返回地址
C中的存储类别分为4种:
自动的、静态的、
寄存器、
外部的、
1.自动变量
在函数内部如果不专门声明static(静态)存储类别,都是动态地分配存储空间,数据存储在动态存储区中[code] int f(int a) { auto int b,c=3;//等价于int b,c=3; }
2.静态局部变量(static 局部变量)
我们在函数内部定义的变量都是动态的,当函数执行完毕之后就会被系统回收掉,但有时根据需求,某个变量的值不能被回收,这里有需要加入static局部变量,加上之后这个变量直到程序结束后才会被释放掉,这种形式在就是阶乘时经常用到。[code] int fac(int n); int i; for (i=1; i<=5; i++) { printf("%d!=%d\n",i,fac(i)); } int fac(int n) { static int f=1; f=f*n; return (f); }
3.寄存器变量(register)
在过去机器运算低下的情况下,为提高运算效率允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器中去取,不必再到内存中去取。对寄存器的存取速度远高于对内存的存取速度,这种变量叫做寄存器变量。现在一般都比怎么用。4.全局变量
全局变量的生命周期是到程序结束,但作用范围却根据在哪里申请而受到限制,主要分为两种情况:在一个文件内
[code]int main(int argc, const char * argv[]) { extern A; printf("%d",A); return 0; } int A=10;
我们在main函数下边申请了一个变量A,按照从上到下的顺序,我们不能够在main函数里面调用变量A,但引入extern关键字我们就可以实现。
在两个文件间
file1文件
[code]int A=10; int main() { print(); return 0; }
file2文件
[code]extern A; int print() { int print=A; return (A); }
倘若我们不想让别的文件引入我们的变量我们可以在变量前面加上static,这样就不会出现两个文件间进行互用一个变量了。
我们对static做个总结:
(1)对局部变量用static声明,是为了把它分配在静态存储区,程序执行过程中分配的空间不释放,(2)对于全局变量用static声明,作用是让变量作用域只限于本文件模块中
相关文章推荐
- leetcode随笔VIII
- cocos2d-x 2.2.3 之菜单分析(1)
- x86 spinlock实现分析
- extern "C"
- Mysql 出现Table‘xxx’is read only问题
- 电视答题
- Android 5.1编译指令
- CodeForces 611C New Year and Domino(DP)
- 3.09课·········打印矩形,三角形和菱形
- VIM 实用技巧 小记
- 字符串Unicode和ANSI互转函数
- 利用QT开发一个记事本
- poj 2251 Dungeon Master
- NASM 中 SECTION 的默认对齐
- Idea Intellij没有拼写检查错误提示
- 【数据结构】安卓平台下深度优先搜索的应用--走迷宫
- Redis 3.0.7版本启动时出现警告的解决办法
- js重走(一)
- Geant4 模拟过程
- <2048>调查报告心得与体会