「被释放掉了,为了证明这一点,我们在刚才的代码中添加一句代码,同时也向你们介绍&』的第三个功能,取地址。
int ieldArea()
{
int a = 100;
or(int i = 0; i < 10; i++)
{
int b = i;
print(“b 的地址是:%d“,&b);
}
}
之前我们已经学过了&』的两种用法,一种是用于两个数做位与运算,一种是用来做逻辑与,而这种放在一个变量的命前面的操作,叫做取地址。
至于什么叫地址,我简单的说一下。
最开始我给你们说过,电脑的最基本组成是成千上万亿个开关构成的,但是虽然都是开关,却也分不同的类别,主要来说分为三种。
第一种CPU,它是电脑的核心,它的里面的开关状态转换速度非常快,但是造价也非常贵。
第二种硬盘,就是我的电脑』里边什么C、D、E、F盘,用来保存文件,代码这些。硬盘的开关状态转换就很慢了,好处是便宜。
当我们要运行程序的时候,CPU需要从硬盘中读取编译成机器语言的.exe,但是硬盘的读写速度相对于CPU来说太慢了,根本没有办法让它的效率得到有效的发挥。
于是就引入了第三种——内存,内存的开关状态转换速度在CPU和硬盘中间,造价也是如此,所以它就作为了CPU和硬盘的一个缓冲介质。
当CPU要从硬盘里边读写数据的时候,就让内存先去加载,然后CPU再从内存中读取。CPU在读取内存里面的数据时,内存又可以去硬盘中读取后面的内容,这样就形成了一个流水线,CPU的执行效率就大大提高了。
所以,程序要正常运行,就需要依靠内存。一旦内存不够用了,电脑就会变得特别卡,甚至于死机。你们看,桌面边边这个显示百分比的圆球就是电脑管家显示的内存使用情况。
理论上来说,内存的容量越大,就可以开越多的程序,但是也不是越大越好。因为程序的执行是由CPU来调度的,假设CPU的极限是调度1000个程序,而内存的容量可以供1500个程序使用也是没有意义的。
现在主流的配置一般都会给电脑搭配16GB的内存,这是什么概念呢?1GByte=1024MByte=1024x1024KByte=1024x1024x1024Byte。在最开始和你们说过,为了方便管理,个开关被统一为一个字节Byte,你们自己算算,这是有多少个字节。
为了便于管理,开发计算机的那些科学家就给每一个字节编了一个号,而这个编号就叫内存地址。我们用&』获取的正是一个变量在内存中的地址。」
老爹一边说,还一边将我的电脑机箱盖子打开了,和我们介绍CPU、内存条和硬盘长什么样子。这些知识虽然看上去和编程没有关系,但是却在编程中起着举足轻重的作用。
老爹在介绍完了之后,我和小弦子将ieldArea函数给运行了一下,结果让我傻眼了,因为10次打印出来变量b的地址居然是一样的!
我重复了运行了好几次,虽然每次运行b的地址和上一次的不一样,但是在这10次循环中的地址却是一模一样。
再三检查后,我确认不是自己的问题,于是看向了小弦子,看看他那边是个什么情况。
结果小弦子的情况和我完全相同!这是什么情况?难道是老爹讲错了?
我和小弦子都看出了对方眼里的疑惑,我们同时看向了老爹。
老爹愣了一下,然后在看了我和小弦子程序运行结果后陷入了沉思。
紧接着他在自己电脑上运行了一下,结果也是一样的。
「对不起,孩子们,这里应该是我讲错了。从我读大学那个时候就一直以为在or循环体里面声明的变量应该是每次都是重新生成的,谢谢你们纠正了这个错误。」
说完,老爹郑重地向我们道了歉。
「有很多事情,一直便是如此不见得都是对的,就算是目见耳闻都不一定是真的,通过这件事你们也应该能够看出来了。所以啊,我希望你们保持一颗质疑、求真的心。
好了,咱们接着讲作用域。变量的作用域除了通过大括号来判断,还有几种比较特殊的情况:
第一种,or循环小括号中定义的变量。
or(int i = 0; i < 10; i++)
{
}
这里的变量i它的作用域就是整个or,所以我只能在or结构内使用它,一旦脱离or的作用域,它就被释放了。