xiongxianhe的专栏

先来提个问:什么是变量?

也许,你习惯性的摆出你爱思考的方式:抬头上仰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

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为函数的形参,为表示区别)

从上面的代码中我们更可以看出,在函数调用中,值传递、指针传递、引用传递的区别。

最后,再问一个问题,变量是什么?

你理解了吗?

————–

找寻隐藏在山间的纯净和那“鸟鸣山更幽”的飞鸟。

xiongxianhe的专栏

相关文章:

你感兴趣的文章:

标签云: