先来提个问:什么是变量?
也许,你习惯性的摆出你爱思考的方式:抬头上仰30度,右手扰向后脑勺:“呃,变量啊......,变量就是变量啊,如int a; a就是int型变量啊......”。
好吧,变量就是变量了。
变量,就像空气一样,散布在所有计算机编程语言中,至于c/c++中的变量,你又知道多少呢?她与你形影不离,你对她的了解,又有多少呢?本篇,给大家讲解下,在c/c++中,到底什么是变量。
c/c++变量有3个维度:
1、变量名
2、变量地址
3、变量地址里的值
如何理解,先上代码(程序猿总是喜欢看代码):
#include <iostream> using namespace std; int main() { int a = 2;//(i) printf("&a=%d, a=%d\n", &a, a);//(ii) return 0; } |
运行结果:
&a=0x2ef7a0, a=2 |
在这段代码中,(i)是定义int型变量a,并且初始化为2。(ii)是打印a的地址,以及a的值。从结果中我们可以得出:
1、a是变量名
2、a的内存地址为0x2EF7A0
3、内存地址里存放的值为2
ps:变量名与变量地址有什么关系?
打个比喻:江西农业大学在地图上有自己的经度和维度(115.839315,28.768197),则(115.839315,28.768197)就是江西农大的地址,而江西农业大学则是变量名a,江西农业大学里面有学生和老师,则这些学生老师就是地址里面的值,如图:
我们再来看:
#include <iostream> using namespace std; int main() { int a = 2;//(i) 普通变量 int *pa = &a;//(ii) 指针变量 int &ra = a;//(iii) 引用变量 printf("&a=0x%x, a=%d\n", &a, a);//(iv) printf("&pa=0x%x, pa=%d, *pa=%d\n", &pa, pa, *pa);//(v) printf("&ra=0x%x, ra=%d\n", &ra, ra);//(vi) return 0; } |
运行结果:
&a=0x1ffe50, a=2 &pa=0x1ffe44, pa=0x1ffe50, *pa=2 &ra=0x1ffe50, ra=2 |
我们分析代码:
1、首先,(i)(ii)(iii)定义了3中不同的变量
2、(i)普通变量上面我们已经说过,对于指针变量,也是有3个维度:
(1)pa是变量名
(2)pa有自己的内存地址(0x1ffe44)
(3)pa内存地址里存放的值为:0x1ffe50
ps:对比(iv)和(v)的输出结果,我们更可以明白:指针是存放地址的变量(pa的值是a的地址),如图:
3、有同学就又说了,老师,引用变量就没有你说的3个维度了。好吧,我们先来看引用的定义:引用是被引用变量(或对象)的别名。如何来理解这句话呢,照样还是上面的那个比喻,经度和维度(115.839315,28.768197),这个地方是叫江西农业大学,但是在江西省,她还有个名字叫:江西农大,江西农业大学和江西农大就是同一个地方,而这个“江西农大”就是我们计算机世界中的“引用”变量名。所以说,引用变量也是有3个维度的,只是:
(1)ra是引用变量名
(2)ra的地址就是a的地址。
(3)ra内存地址里存放的值就是a内存地址i的值,如图:
有同学又说,老师,我还是不明白,你说的是啥意思。
呃~~~,好吧,我们再来“实战”下:
#include <iostream> using namespace std; void fun1(int a) { printf("(i):&a=0x%x, a=%d\n", &a, a);//(i) a = a + 1; } void fun2(int *a) { printf("(ii):&a=0x%x, a=0x%x, *a=%d\n", &a, a, *a);//(ii); *a = *a + 1; } void fun3(int &a) { printf("(iii):&a=0x%x, a=%d\n", &a, a);//(iii); a = a + 1; } int main() { int a = 2; printf("(iv):&a=0x%x, a=%d\n", &a, a);//(iv) fun1(a);//(v) fun2(&a);//(vi) fun3(a);//(vii)
return 0; }
|
上面(i) ~ (iv)几个输出结果,同学们去思考下,为什么是这样的,以及每个函数中a=a+1;是否会改变实参的值。
ps:简要说下函数的调用:在(v)调用fun1时,主函数除了要把当前上下文数据(不清楚可百度)保存外,还会把实参的值给形参,如:
fun1(a); ===> int a1 = a;
fun2(&a); ===> int *a1 = a;
fun3(a); ===> int &a1 = a;
(a1为函数的形参,为表示区别)
从上面的代码中我们更可以看出,在函数调用中,值传递、指针传递、引用传递的区别。
最后,再问一个问题,变量是什么?
你理解了吗?
--------------
微信公众平台:
原文:http://blog.csdn.net/xiongxianhe/article/details/44573641