变量的本质是什么?
那么到底什么是变量?看看下面这个程序:
关键看前两句,第三句 printf 的用法非常复杂,功能非常强大。但是因为其用法太灵活了,所以很容易出错。在后面会专门用一章的内容详细地介绍 printf,这里先不讲。
当单击编译、链接、执行后弹出一个黑色窗口,关闭那个黑色窗口后,就意味着这个程序运行了一遍,而且这一遍已经终止了。此时存储 3 的内存空间就没有了,要是有的话就麻烦了!如果任何软件运行一遍后为它分配的空间仍保留着,那么计算机再运行几次就不行了。程序运行完之后,为这个程序所分配的所有内存空间通通都会被释放掉,以便被下一个程序使用。
所谓“释放”并不是指清空该内存空间,而是指将该内存空间标记为“可用”状态,使得系统在分配内存的时候可以将它重新分配给其他变量使用。
如果没有释放的话系统在分配内存的时候是不会使用该内存空间的,因为它已经被别的变量使用了,是不可用的状态。“释放”这个词后面会经常说到,大家要注意一下。
下面看看这两条语句是怎么运行的。首先看程序是如何运行
然后
前两条语句就是这么运行的。以后只要使用 i,操作系统就会自动找到那个与它关联的存储单元。
而利用变量就可以很方便地解决这个问题!当定义了一个变量之后,此时变量对应的是哪个存储单元,那个存储单元的编号是什么,通通都不用我们考虑,系统内部会自动产生一一对应的关系。这样就方便了对数据的存储和对内存单元的操作。
# 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 个编号,这样编程是不可能实现的。而利用变量就可以很方便地解决这个问题!当定义了一个变量之后,此时变量对应的是哪个存储单元,那个存储单元的编号是什么,通通都不用我们考虑,系统内部会自动产生一一对应的关系。这样就方便了对数据的存储和对内存单元的操作。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算