一段代码
编程入门篇,一般都是 Hello World
起步,太俗套了,我们来点不一样的 C++ 入门示例吧:
#include <iostream>
using namespace std;
int main() {
// 国王信息:我在7号房放了一件宝贝
int var_7 = 1;
// 大家各自记住的信息
int a = var_7;
int *b = &var_7;
int *const c = &var_7;
int &d = a;
// 问答和作弊时刻(修改数据答案)
a = 0;
*b = 0;
cout << "地址: b=" << b << " ,地址: (b + 1)=" << b + 1 << " ,数值: *(b + 1)=" << *(b + 1) << endl;
// b = &a; // 指针变量的值可以修改
*c = 0;
cout << "地址: c=" << c << " ,地址: (c + 1)=" << c + 1 << " ,数值: *(c + 1)=" << *(c + 1) << endl << endl;
// c=&a; // 错误, const 修饰的常量 c 不可以修改
//公布答案
cout << "int var_7,int a,int *b,int *const c,int &d" << endl;
cout << "数值: var=" << var_7 << " ,a=" << a << " ,b=" << b << " ,c=" << c << " ,d=" << d << endl;
cout << "地址: &var=" << &var_7 << " ,&a=" << &a << " ,&b=" << &b << " ,&c=" << &c << " ,&d=" << &d << endl;
cout << "取数: var=" << var_7 << " ,a=" << a << " ,*b=" << *b << " ,*c=" << *c << " ,d=" << d << endl;
// a==*b==*c==d, &a==b==c==&d
return 0;
}
先说下运行结果与结论:
1. 数值 a==*b==*c==d
2. 地址 &a==b==c==&d
运行日志
地址: b=0x16f39ef8c ,地址: (b + 1)=0x16f39ef90 ,数值: *(b + 1)=1866067888
地址: c=0x16f39ef8c ,地址: (c + 1)=0x16f39ef90 ,数值: *(c + 1)=1866067888
int var_7,int a,int *b,int *const c,int &d
数值: var=0 ,a=0 ,b=0x16f39ef8c ,c=0x16f39ef8c ,d=0
地址: &var=0x16f39ef8c ,&a=0x16f39ef88 ,&b=0x16f39ef80 ,&c=0x16f39ef78 ,&d=0x16f39ef88
取数: var=0 ,a=0 ,*b=0 ,*c=0 ,d=0
故事时间到,我好不容易攒了一个故事
,我们不妨换种风格
来说说上面的代码
一个故事
相传在很久很久以前,西方有一群神秘的人,擅长写天书
,掌管万物生命(例如上面的那段代码),但人间无人能看懂
,于是唐三藏为求取真经普渡世人,也为了能解开那个天书之迷
,于是踏上了西行的路。
此时师徒历经磨难,终于到了车迟国,拼音前缀为ccg
,倒过来是 gcc(GNU Compiler Collection),你信不信这是上天注定的巧合
?
国王盛情款待师徒4人,唐僧住10号房
(0x000a),悟空住11号房
(0x000b),八戒住12号房
(0x000c),沙僧什么都唯师傅是尊
,连住他要和师傅挤一起,也住10号房
。
晚饭时间到,大家在房间内里整理,这时接到一个来自国王的视频会议:
“席间无以为乐,大家来玩个游戏吧,有奖竞猜,猜对有饭吃,猜错饿肚子。”
车迟国国王:“我在7号房里放了 1 件宝贝
,你们四人在各自房间猜,不可以走动,也不可以去偷看答案哦……
”
这简直明晃晃地告诉我怎么作弊
吗?但大家都是有素质的人,绝对不会作弊的,来看看师徒4人的表现:
唐三藏(代号为 a,住在 `0x000a`):是 1 件,记住了:1
孙悟空(代号是 b,住在 `0x000b`):是 7 号房,记住了:7
猪八戒(代号是 c,住在 `0x000c`):是 7 号房,记住了:7
沙师弟(代号是 d,住在 `0x000a`):师傅说啥就是啥,我也不记,直接抄师傅的
“有请唐长老先猜……”
唐三藏(代号为老a,住在 0x000a)
:记得是个 1,1 啥来着?急急急,在线等……
“哦,陛下,是 1 个和尚(a=0
)”
正确的答案活生生让他给改错了,像极了上学时期的我在听英语听力
,就因为不自信,把分给改没了,所以大多时候要相信自己的第一感觉哈
好,我们的老唐选手率先做出了错误的决定
,他的答案也由1变成了0
:
“哈哈哈哈哈……和尚你错了,是 1 个道士……”
孙悟空(代号二b,住在 0x000b)
心想,师傅这头秃驴,中看不中用
,平时不知都在想啥呢,成天想和尚
,关键时刻还得要俺老孙出手。
说着他一个元神出窍
,变成一只苍蝇(*)
,是啥来着,记得是个 7
,哦,对了,7号房
,悟空就飞到了 7号房里面(*b
),确实是个道士,我给他改改,剃掉头发(*b=0
),于是 7号房的道士(1)
变成了光头和尚(0)
,然后悟空又去了8号房看看(*(b+1)
),9号房(*(b+2)
)……
对了还得去看看师傅真实的答案(b=&a
),哦,师傅答案是和尚,确实没听错,可以放心了。
就这样,我们的二号选手把7号房的道士(1)
改成了 和尚(0)
:
猪八戒(代号c货,住在 0x000c
),你猜是蠢货还是吃货
?他会三十六变
,看师傅和大师兄不靠谱,一个瞎猜,一个不动,那还不玩完了,心想,还得靠我老猪出马,不然猜错了连饭都没得吃了。他也元神出窍
,变成了苍蝇(*)
,按照记忆的数字7
,也来到了 7 号房
,确认了里面确实是个和尚(0,绝对是大师兄干的,毛手毛脚的
),又再给小和尚从头到脚刮了一遍(*c=0
),连胡子都不放过。
这下7号房的光头就更光了:
终于搞定了,这时他也想去8号房看看(*(c+1)
),也可以看到哦,原来 8 号房放了个桃子,下一个 9 号房(*(b+2)
)……
他也想看看师傅的答案(c=&a
),但是有股力量阻止他了,他的记忆是刻进了骨子里的,最开始记住是 7 那就一直是 7
,永远改不了,所以人们为什么骂人会说,你猪脑子啊
,连这都记不住?那就是这个原因,先入为主,后面就不好改变了,他只能在 7 号房附近一个个找过去,如果师傅的在附近,一定能找到的 (*(c+3))
,但不能修改记忆直接去找(c=&a 会报错
),也不能直接去找其他人(c=&x 也会报错
)。
沙师弟(代号小d)
这个跟屁虫
一直在师傅旁边,看到几位师兄都不说话,答案是啥他可不管也不记
,只知道凡是师傅说的就一定是对的
,就跟现在的跟投党
是一样一样的
“大师兄,师傅说的对啊!” 但悟空元神出去浪了
,没搭理他
转头又对八戒说:“二师兄,师傅说的对啊!” 但八戒还在7号房
未回,也没搭理他
“大师兄,二师兄,师傅说的对啊!” 他还特意提高了嗓门,生怕他们没听见
“嗯嗯,对对对,是和尚,是和尚,三藏哥哥好棒……” 正巧两个人都回来了,氛围组瞬间拉满。
轮到国王公布答案,他打开 7 号房间,这下他彻底傻眼了…… “哪来的和尚呀?”
过了很久以后,他们取到了真经,随着经书传世,大家都学起来了,天书也迎刃而解,至今还有人在写天书,一天至少写几百上千行的,众人称之为码农
原来当年唐僧去西天取的经书叫C/C++ 程序设计
啊!一路上的81难,全是佛祖写的程序代码
,有人说 god is a girl
,但佛祖一定是个大码农
,有图为证:
/*
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// . ' \\| |// `.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
//
// .............................................
// 佛祖保佑 永无BUG
// 佛曰:
// 写字楼里写字间,写字间里程序员;
// 程序人员写程序,又拿程序换酒钱。
// 酒醒只在网上坐,酒醉还来网下眠;
// 酒醉酒醒日复日,网上网下年复年。
// 但愿老死电脑间,不愿鞠躬老板前;
// 奔驰宝马贵者趣,公交自行程序员。
// 别人笑我忒疯癫,我笑自己命太贱;
// 不见满街漂亮妹,哪个归得程序员?
*/
总结
术语 | 示例 | 饰演者 | 功能 |
---|---|---|---|
变量 | a,b,c,d | 唐,孙,猪,沙 | 给人看的助记符,对应的其实是内存地址 0x0a, 0x0b, 0x0c, 0x0a, a与d变量对应的内存地址还是同一个 |
地址 | 0x0a, 0x0b, 0x0c, 0x07 | 房号, 例如: 7号房 | 给机器看的, CPU寻址所用,通过地址找到内存存放的数据,用来做下一步的运算 |
变量, 地址之间相互关联
, 在我们人类眼里
它们是两个东西, 但在机器眼中
没有变量一说, 全是基于地址操作
, 传参都是地址
欲知后事如何,且听下回分解……