变量的本质是什么?

那么到底什么是变量?看看下面这个程序:
# include <stdio.h>
int main(void)
{
    int i;
    i = 3;
    printf("i = %d\n", i);
    return 0;
}
在上面这个程序中,首先定义了一个变量 i,然后把 3 放到 i 里,接着输出 i。

关键看前两句,第三句 printf 的用法非常复杂,功能非常强大。但是因为其用法太灵活了,所以很容易出错。在后面会专门用一章的内容详细地介绍 printf,这里先不讲。

int i;表示定义了一个变量 i。那么程序在运行时定义的变量 i 存储在什么地方呢?存储在内存还是硬盘上?答案是存储在内存。

当单击编译、链接、执行后弹出一个黑色窗口,关闭那个黑色窗口后,就意味着这个程序运行了一遍,而且这一遍已经终止了。此时存储 3 的内存空间就没有了,要是有的话就麻烦了!如果任何软件运行一遍后为它分配的空间仍保留着,那么计算机再运行几次就不行了。程序运行完之后,为这个程序所分配的所有内存空间通通都会被释放掉,以便被下一个程序使用。

所谓“释放”并不是指清空该内存空间,而是指将该内存空间标记为“可用”状态,使得系统在分配内存的时候可以将它重新分配给其他变量使用。

如果没有释放的话系统在分配内存的时候是不会使用该内存空间的,因为它已经被别的变量使用了,是不可用的状态。“释放”这个词后面会经常说到,大家要注意一下。

下面看看这两条语句是怎么运行的。首先看程序是如何运行int i;的:当编译器运行第一条语句的时候,它会请求操作系统在内存中寻找一个空闲的存储单元,然后把它当作变量 i 来使用。也就是说这个存储单元的地址和 i 产生了一种关联。即变量 i 现在就是这个存储单元,这个存储单元现在就是变量 i。

然后i=3;的结果是把 3 存放到变量 i 所关联的那个存储单元中。

前两条语句就是这么运行的。以后只要使用 i,操作系统就会自动找到那个与它关联的存储单元。

为什么要使用变量

为什么要使用变量?如果不使用变量的话,那就意味着我们要自己编程寻找内存里面的那个存储单元。而内存里面有很多存储单元,每个存储单元都有一个编号。如果须记住这些编号的话就太麻烦了。假如要定义 100 个变量,那就要记住 100 个编号,这样编程是不可能实现的。

而利用变量就可以很方便地解决这个问题!当定义了一个变量之后,此时变量对应的是哪个存储单元,那个存储单元的编号是什么,通通都不用我们考虑,系统内部会自动产生一一对应的关系。这样就方便了对数据的存储和对内存单元的操作。