c/c++变量,你知多少

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

也许,你习惯性的摆出你爱思考的方式:抬头上仰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为函数的形参,为表示区别)


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


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

你理解了吗?


--------------

微信公众平台:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiongxianhe

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值