学习C语言,首先要分清楚变量的两层含义:第一层是指储存变量的内存空间,也就是一些书上说的“左值”;另一曾意思是变量的值(说白了就是个常量)。
第一层意思中说的内存空间就是内存中能够被访问的的地方(内存地址),具体就是能够存储数值,也能够取出其中的值。
第二层意思可能不大好理解,为什么变量的值又成常量了呢?举个例子
int val = 5;
这一句干了两件事:
1、分配一个int类型对应大小的内存空间,把这个内存空间和val关联起来(val的内存地址就是那个分配的地址)。
2、在这个空间中储存数值5。
执行下面这一句:
val = val +1;
1、首先找到等号右边的val的内存空间,并且取出其中的数值5并传送到CPU
2、把数值5加上1,计算结果为6(这一步只于CPU中的寄存器有关,和内存没有关系,也就是说和val没有关系)
3、把计算结果(数值6)再次保存到等号右边val对应的内存空间中。(这一点说明,等号左边的值必须一个内存空间(内存地址),而不是某个变量的值,更不是一个常量。)
看第二步会发现,从数值5到数值6,只是从一个常量改变到另一个常量,这过程中val中的值仍然是数值5。
所以,我们说的变量通常指的是某部分内存空间,而不是其中保存的值。对于内存空间中的值来说,在变为另一个值之前,它一直是不变的,所以说,内存空间中保存的并不是变量,而是常量。
这就引发了C语言编程中经常混淆的值传递还是引用传递(非常抱歉,因C#语言编写的时间相对长些,类似的东西在C语言中到底叫什么不记得了,暂且叫引用传递吧。)
值传递是指传递变量中的值(就是内存空间中的那个常量)。
引用传递是指传递变量的内存地址。
这样的话就会发生下面两种情况:
1、给函数传递值(值传递)的话,不论函数中如何处理这个值,都是在处理这个常量,并没有处理原来那个变量内存空间中的值。
2、给函数传递引用(引用传递)的话,不论函数中如何处理,都是处理原来那个变量内存空间,其中的值也就改变了。