关于变量的一些笔记

来源:互联网 发布:衣阿华 知乎 编辑:程序博客网 时间:2024/06/06 00:47

一、局部变量和全局变量

从空间角度,也就是作用域角度,变量可以分为局部变量和全局变量。
1.局部变量
是在一个函数内部定义的变量,只能在本函数范围内有效。
2全局变量
是在函数外定义的变量,也叫外部变量。主要作用是增加函数之间的数据联系渠道,如果一个函数改变了全局变量的值,就能够影响到其他函数,使其他函数中引用的同名变量也同时改变。
全局变量要尽量避免。因为它有一些缺点:

  • 占用全局数据区。在程序全部执行过程中都要占用存储单元,而不是仅仅在需要时才开辟存储单元
  • 降低通用性,程序是要低耦合的。如果将某个函数移到另一个文件中,还要将相关的外部变量一起移植过去。
  • 若与局部变量重名,则在局部变量范围内,全局变量被屏蔽。

二、变量的存储方法

根据变量的存储期(存在的时间)不同,可以分为静态存储和动态存储。

1.静态存储

在程序运行期间,系统对变量分配固定的存储空间。主要存放全局变量,static声明的静态局部变量。

2.动态存储

在程序运行期间,系统对变量动态分配存储空间。主要存放形参,函数中定义的变量(未static声明的局部变量),函数调用时的现场保护和返回地址。这个存储区分为堆和栈,一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

三、变量的存储类别

主要有四种类别:自动(auto),静态(static),寄存器(register),外部(extern)

1.自动变量

函数中的局部变量,且未加static声明的,是动态分配存储空间,auto可以省略。如果没有初始化的话,则是一个不确定的值。

#include <iostream>using namespace std;int main(){ int a; cout << a << endl; system("pause"); return 0;}

a为auto自动变量,且auto可以省略。可以看到运行结果是:
这里写图片描述

2.静态局部变量

使用static声明的局部变量,其值在函数调用后不消失而保留原值,其占用的存储单元不释放。主要特点:

  • 在静态存储区分配内存。
  • 在程序首次执行到该对象的声明处时被初始化。
  • 若不赋初始值,编译器自动赋值为0(数值型)或者NULL(字符型)
  • 虽然在函数调用后还存在,但是其他函数不能引用他,也就是对其他函数内不可见。
#include <iostream>using namespace std;int main(){    static int a;    cout << a << endl;    system("pause");    return 0;}

这个例子在上个例子的基础上加上了static,a变成了静态局部变量,被编译器初始化为0,运行结果为0。

3. 寄存器变量(register声明)

我们知道计算机有存储结构,是在速度和成本的折中。CPU运算单元从寄存器取数据要快于存主存中取数据。用register声明的寄存器变量适合需要频繁存取的场合。不过现代编译系统能够自动识别使用频繁的变量,放到寄存器中。

int fun(int n){    register int i, f =1;    for (i = 1; i <= n; i++)        f = f*i;}

其中i 和f 为寄存器变量。

4.用extern声明的外部变量

主要作用:如果一个程序包含两个文件,两个文件中都要用到同一个外部变量,可以在任意一个文件定义外部变量X,在另一个文件中用extern对外部变量作声明:extern X
**注意:**extern只是用作声明,不是用作定义,只是对一个已经定义的外部变量作声明,以扩展其作用域。

5.用static声明的外部变量

主要作用:保证该外部变量只能在本文件中引用,而不能被其他文件引用。
注意:加不加static声明的外部变量都在静态存储区存储。
在b.cpp 文件中有一句代码:

static int a = 3;

在a.cpp中有如下代码:

#include <iostream>using namespace std;extern int a;int main(){    cout << a << endl;    system("pause");    return 0;}

虽然在a.cpp中加了extern,还是不能引用a,会在链接时候出现错误:
这里写图片描述

对于static,在c++的类里还有很重要的应用。下次空了再继续整理。