c/c++ 中变量的存储类别
2015-04-01 16:45
375 查看
1. 变量分类
从变量的作用域全局变量
在函数外部定义的变量被称作外部变量或全局变量。
局部变量
在函数内部定义的变量,只在本函数内部有效。
从变量的存储时间(生存周期)
静态存储方式
程序运行期间固定分配的存储空间。
动态存储方式
程序运行期间动态分配的存储空间。
2. 内存分区
参考《Windows内存管理》全局变量,静态变量都存储在“静态存储区”;
函数的形式参数,自动变量(未加 static 声明的局部变量),函数调用时的现场保护和返回地址,这些都存储在“动态存储区”。
在 c 语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。
数据类型:字符型,整型,浮点型等
存储类别:静态存储和动态存储。
对变量的声明有四种基本的类型: auto 变量,static 变量,register 变量,extern 变量。
3. auto 变量
函数中的局部变量,如果不专门声明为static存储类别,那么都是动态分配存储空间。
关键字
auto可以省略,如果不写,都隐含确定为“动态存储类别”。
int fx(int a) { auto int b, c = 3; // 等价于 int b, c = 3; ... }
执行完 fx 函数后,a,b,c 所在的存储单元自动释放。
4. static 声明局部变量
用static 申请的局部变量在函数抵用结束时不消失,而是保留原值,下一次调用时,该变量值依然保持。#include <iostream> void FileOneFxOne() { int iA = 0; static int iStatic = 1; iA++; iStatic++; std::cout << "局部变量 iA = " << iA << std::endl; std::cout << "局部静态变量 iStatic = " << iStatic << std::endl; } int main() { std::cout << "第一次调用:" << std::endl; FileOneFxOne(); std::cout << "\n第二次调用:" << std::endl; FileOneFxOne(); return 0; }
第几次调用 | 起始 | 结束 |
---|---|---|
第一次调用 | iA = 0; iStatic = 1 | iA = 1; iStatic = 2 |
第二次调用 | iA = 0; iStatic = 2 | iA = 1; iStatic = 3 |
第三次调用 | iA = 0; iStatic = 3 | iA = 1; iStatic = 4 |
5. register 变量
一般情况,变量都存在内存中,c 语言允许将局部变量的值放在 CPU 的寄存器中,寄存器的存取速度远远大于内存的存取速度。void fx() { register int i; ... }
只有局部自动变量和形参可以作为寄存器变量,局部静态变量不能作为寄存器变量。
当今的优化编译器可以自动识别使用频繁的变量,从而自动将这些变量放在寄存器中。
6. 用 extern 声明外部变量
用extern来声明外部变量,是为了扩展外部变量的作用域。
int main() { extern A; A++; ... } int A = 0; int fx() { ... }
由于 全局变量 A 定义在 mian 函数之后,所以如果不使用 extern 关键字,编译器将报错。
extern 也可以将全局变量的范围扩展到同一源程序的不同文件之中,如下所示:
file1.cpp
#include <iostream> #include "FileTwo.h" int iGlobal = 3; int main() { std::cout << "main : iGobal = " << iGlobal << std::endl; FileTwo(); std::cout << "main : iGobal = " << iGlobal << std::endl; FileTwo(); return 0; }
file2.cpp
#include "FileTwo.h" #include <iostream> extern int iGlobal; void FileTwo() { iGlobal++; std::cout << "FileTwo : iGlobal = " << iGlobal << std::endl; }
file2.cpp 头文件
#ifndef FILETWO_H #define FILETWO_H void FileTwo(); #endif
输出结果
main : iGobal = 3
FileTwo : iGlobal = 4
main : iGobal = 4
FileTwo : iGlobal = 5
在一个文件中定义的外部变量,在另一个文件中通过 extern 来声明。
7. 内部函数和外部函数
内部函数:只能被文本中其他函数调用。如:static int fx();
static使其局部化,不能被其他文件引用。
外部函数:在函数的最左端加上关键字
extern,则表示可以被其他函数调用,如:
extern int fx();
c语言中规定,如果在定义函数时省略
extern,则隐含为外部函数,在需要调用此函数的文件中,用
extern对函数做声明。
8. static 的全局与局部
全局变量:普通全局变量:作用域是整个源程序,在同一源文件的不同文件中可见
static 全局变量:作用域是所在的源文件,只能被定义该变量的文件中可见
局部变量:
普通局部变量:
运行时赋值,每调用一次赋一次值,调用结束自动释放。
static 局部变量:
程序编译时赋值,只初始化一次,函数调用结束其值依然存在,不释放。
函数:
普通函数:可以被同一源程序中的其他函数调用。
static 静态函数:只在定义该函数的文件中可见,不能被源程序中的其他文件使用。
9. 参考
《c程序设计》第三版相关文章推荐
- C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量、外部变量)
- C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量、外部变量)
- C++学习 【4.5】 利用函数实现指定的功能---局部变量、全局变量、变量的存储类别、声明和定义
- [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要
- C++变量的存储类别
- C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量、
- 深入理解C++中变量的存储类别和属性
- [C++程序设计]变量的存储类别
- C++变量的存储类别与作用域
- C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量)
- C++中变量的存储类别和属性
- C++之内置函数、函数模板、变量的存储类别、类、析构函数、指针
- C++ 变量存储类别 解析
- 深入理解C++中变量的存储类别和属性
- 深入理解C++中变量的存储类别和属性
- C/C++中的变量存储类别以及内存分配
- C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量、extern、static) 总结
- C/C++中的变量存储类别以及内存分配
- C/C++中的变量存储类别以及内存分配
- c++学习之变量的存储类别