速学 C/C++之启蒙篇

一段代码

编程入门篇,一般都是 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寻址所用,通过地址找到内存存放的数据,用来做下一步的运算

变量, 地址之间相互关联, 在我们人类眼里它们是两个东西, 但在机器眼中没有变量一说, 全是基于地址操作, 传参都是地址

欲知后事如何,且听下回分解……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

铅笔侠_龙虾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值