您的位置:首页 > 编程语言 > C语言/C++

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 = 1iA = 1; iStatic = 2
第二次调用iA = 0; iStatic = 2iA = 1; iStatic = 3
第三次调用iA = 0; iStatic = 3iA = 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程序设计》第三版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息