指针炼狱

内存,总是令人着迷。

人的大脑,有多少内存啊?

我曾追寻世界的谜题,发现有极少数人可以做到过目不忘。他们的大脑是怎么构成的啊!!!

因此人们开始找寻谜底。直到那个医生无耻地抛开了世界上最聪明人的脑壳,我们才发现,原来大脑的褶皱才是天才的奥秘。

物理、化学、生物、数学,这无数的自然科学,想要样样精通真的很难,但历史上伟大的人往往是触类旁通。

牛顿,物理学。发明了微积分,数学。万年沉迷于炼金术,化学。

惊叹与他们开了挂一样的人生后,不免要思考,为什么他们可以?

所以,那个医生才剖开了爱因斯坦的脑壳,想要探究奥秘。

世界,到底有多么相似。因此,人脑和电脑又究竟有多少区别?

我不知道。我只是感性地认识。

当我生气时,我会发觉我的大脑很沉重。我想要填补一些记忆,急于替换上面一段记忆。我只是偶尔猜想,记忆是不是指令呢?当记忆流淌入意识,神奇的事情发生了。

“湛蓝的天,秋色的雨,神清气爽的风”。这是记忆了。

于是,当夏夜偶有微风吹过,就是这了。

大脑是能和计算机等同的吗?

我无法去深究这个问题。请原谅我用break跳出这个循环。

我在大二下学期时为了能够过四级,给自己了一个挑战,就是过四级。为此,我的大脑要暂时被清空了。

请注意,这学期开有操作系统、数据库、概率论、计算机组成原理。直至今日,考这几门之前的时间我仍历历在目。

我怕不及格,更担心自己复习之后发现更多不会的地方,我就不断的走,不断的走。那几天几乎是和家人的电话以及运动中度过的。

那么,清空之后的大脑要干什么呢?

我用了我一切可能的手段去搜集英语方面的东西。

我了解了英语是一门语言。中国之英语和把英语当做母语的人学英语的区别。美国小学、初中、高中具体的词汇量。英语听、说、读、写之间的奥秘。英语培训机构的套路。亲耳听到正宗标准的外国发音,其实就是一堂和外国人的对话。一些英文资料网站。自创的浏览英文网页学习法…

为什么…呢?因为这些东西用文字表达总是很苍白的。

这一套研究下来,我还是顺利的通过了四级。这并不是什么可喜可贺的事情。为了学习四级,我将我的大脑填满了这方面的内容。而真正有用处的我发现,不过是浏览一些英文网站可以看得懂而已。我是coder,我需要看懂单词。尽管我研究之初就是奔着这个目的,可还是接触了其他一些内容。

这就代表了核心是很小的,但它外面的体系结构是很巨大的。如果用一个术语你能明白,就是"环境"。

这种内存的组织管理方式实在是太不好了。我只是吐槽一下…

直到我接触汇编前,我的知识就像孤岛。我接触过C,java,python,C++。这些语言在我看来就是自成体系。

他们就像武林高手一样,各有千秋,但全然不同。

事实真的是这样吗?

肯定不是。随便找一部武功的电影都会发现,高手的成长之路都是多么相同。

我只是偶尔接触了一下汇编,而且很浅,并且没学完,可是我觉得我有些地方松动了。体系的堡垒不再牢固。

这里是在推荐汇编吗?我觉得不是。我只是在讲一个故事。

最底层的语言毫无疑问会将疑惑博云抛物,让我有一种云开日出的感觉。

这种感觉就让我思考起了很多很多。

无论是生活中还是学习中,我都发现这样一个有趣的现象,那就是“二进制”对计算机的意义。暂且容我说几个例子:

1.我的计算机科学导论老师,总是喜欢用二进制来表示数学公式。2^3在他看来,其实是2^11

2.我租住的地方有一个邻居,他是搞电子元器件的。有一次我和他聊天,抱怨了老师布置的作业太难。他一个对软件什么都不懂的人这样安慰我,他说:“怕什么,计算机不就是一堆0和1吗?”。

3.我在b站上看到一个程序员买了台显示器然后分享体验。他有一句话是,我感觉我的血管里面流淌着二进制。原谅我当时笑了。

无论是这样直观的体验,还是在后来代码中看到的二进制,造成了我对二进制的印象越来越深。

我发觉汇编这样底层的语言其实就是在操作寄存器来控制CPU,从而对寄存器或内存进行读和写。汇编就这点东西了。至于汇编器和连接器是怎样实现的,I don't care,可能我一辈子也不会去管它怎么实现的。我只知道,带我入门的老师甚至对这个汇编器masm的基础选项都懒得教,我就觉得这玩意儿高度自由。我干什么都很固执,这也是为什么我在了解一门高级语言的基础语法之后还会想搞懂指针。没错,我说的高级语言就是Java。光是一个汇编器老师懒得教还不够我信服。我又想起了有个老师说的代码修炼指南。“经常用到的记住”,“偶尔用到的用到去查”。总之,经过了无数人的警告,直到我踩了一个个坑,我终于想起来这回事儿。

就是这么一个问题,我真的是花了好长时间才搞懂,指针炼狱,指针炼狱,说的不就是这么个事儿吗。我学C,指针不懂。老师貌似也没讲,我想搞懂。于是,断断续续地、坑坑洼洼地搞懂了这个东西。老实说搞懂了它感觉自己并没有太大的成就,也就感觉它是那么回事,至少我在写到c代码的时候(我大部分时间写Java),当我写到int* p = &a;的时候,不会再有一种看马赛克的感觉吧。

说回指针。

我反反复复,跌跌撞撞。因为最初选的不是c,而是java。

java里面和指针最有关系的我想大概就是那个性化的错误,空指针异常了。

现在让我理解空指针异常那很好理解了。

这点还是不说了,让读者自己体悟不是更好?再说,研究了这么多,真正留在我脑海中的,可能就是几个图?几件印象很深的事儿?几次自己的尝试?

在我上学期间,一直没有很系统地触碰指针。大部分空闲时间都是在坐井观天。

比如,我会在玩了很多把游戏之后良心发现,去敲一点指针的代码?或是去应征之前的猜测?

最初的我想的其实是通过死记住它可能出现的格式来了解它嘛。当然,这样会导致遇到花里胡哨的问题而不得而知。不过也是时间最短,最可行的事儿了。于是我就在github建立一个仓库,命其名曰c。这样我就不至于在换系统的时候丢失以前的头绪了。我有时候会无聊地尝试更换一个个系统,虽然我不明白为什么要这么做,不过还是乐此不疲,为此花了好多时间在这上面。不过随着时间的深入,我变得越来越懒,渐渐地不想去管系统了。我现在用一个开箱即用的linux,deepin。我觉得它既能让我体验到linux,又能不折腾,所以我就用了,没什么。最多就是注意了一下数据放在另一块机械硬盘的一个ntfs的分区,那个硬盘又多加了几个ext4的分区,因为我感觉不同的格式在读写上性能会有不同。

其实代码就像食物一样,必须立即吃。否则放放放,放久了就变质了。这可以说是我的惨痛教训。我的技术栈的路线上有着一断很长的空白,那段空白几乎被各种各样的事情填补,是一端不堪回首的空白。唯独当初想天天敲的代码不在那块区域。回想起来,真的是令人唏嘘。

可能这就是我后来讨厌折腾的原因吧。但就像那句歌词,生活还得继续,因此我就专门搞懂一个问题嘛,什么问题呢?我花了很长时间,我必须搞懂的指针啊。指针炼狱,指针炼狱,可能没人比我更懂这段代码。

你知道代码是什么吗?

从汇编的角度看,代码就是操作寄存器的逻辑。操作寄存器,cpu就知道哪里是指令和数据。甚至有的指令执行过了它也可以当成数据。

我的性子是很散的,若放在以前,必定是一个逍遥散仙。但为了应付学校的一门课,我不得不将一门叫做嵌入式的课好好地学了学。其实说是学了学,前面都是在整理笔记,也就是理解。但是最后得打代码啊。我记得很清楚,我和别人合作,彻底搞懂了那个数据结构,message quene。要我自己研究,我可能对他的名字就好奇个半天,这是不可以的。事情大致是这样的,我呢,要复习。正好那个人也复习,我就把他的代码搞过来研究了一个下午。

虽然我的c烂得不行,但毕竟站在巨人的肩膀上,以及没吃过猪肉看过猪跑的各种理由,我看懂了消息队列,并且根据老师的题目编写了相应的代码。我承认,我不能胜任一些传递参数的工作,这部分是老师帮忙传递的,但我其实通过不断的排列组合,组合到了一个正确的、无bug的答案。代码的确是逻辑操作占了好大一部分,但如果没有解决一个具体问题用代码这种方式,我不会有什么进步的。甚至我的大脑会拒绝思考这么复杂的问题。可能换成别人,就说这是生活所迫了。但对我来说,我体会到了这个滋味。从此,我的任督二脉就好像打通了一般一样。各种东西在我头脑中融会贯通。什么操作系统啦,什么数据结构啦,什么C++啦。我承认,这竟然是花了一下午,解决了一个问题换来的,现在想想都不可思议。

其实也并没有啦。学以上那些玩意儿的时候头脑总是切换嘛。

这样的一个问题被解决时候,就好像设计了一个巧妙的程序。调用了以前的这些知识。

我记得是从嵌入式之后,我就对代码产生了一个态度的变化。

什么呢?

以前,我是捧着代码。我不会写,就看别人的视频,跟着打一遍。

???有效果?

我承认是有的,学会了别人的代码风格。

可是风格,呵呵,我见过了好多好多,这玩意儿进编译器大家不都一样?

说笑了。于是就得想不是吗?经常用到的熟记于心,不常用到的做好笔记。

因为嵌入式是我第一次必须自己面对底层的东西,我打代码打的很艰难。我了解到,代码不过是一个个功能,不必温柔以待。它不是情人、亲人、我们爱着的人,它不过是我们敲的一个个函数,一次次调用,我们复杂的软件流程图的一个具体的模块。说白了也不过如此。

直到敲完最后一段代码,我直接手捧着下学期的书看了起来。

代码之对我而言就是这些了。可能别人的际遇不同,经历不同。不过我想,大千世界,应该都是一个个三角形的放大缩小,总是殊途同归。这是我看待世界的哲学罢了。

那长长的代码是否引发你思考?

那花了你心血的代码是否值得你总结?

没错。指针,这个荡漾在我生命中的魔鬼,我灵魂的一道枷锁,怎么不值得我去好好赞颂或诋毁?

我经常羡慕Linus.他之于电脑,就是不断地看代码和思考。在他手底下代码按照他的意志输入到电脑中。他是一个极客。

什么是极客?

我曾一度崇拜乔布斯,那个极简主义者。直到我读了那本他的传记,了解到他也不过是生活一团糟的人。他的技术也很一般,相比于和他同期的人来说。我收到最大的影响就是在物的数量和质量上要做到极简。可是我亲身体会到过,物,虽然有些大部分时间用不到,但你必须有。否则就痛不欲生。就像温度计,及时是个简单的,几块钱的,但在你发烧后,那玩儿贼好用。于是我怀疑,那就是极客吗?乔布斯为了推崇那种生活就可以长时间不洗澡,也不管别人的感受?

看着发布会上一年比一年憔悴的乔布斯,我觉得那不是啊。

上面是一个典型的东西。

看到linus,我反而感觉到他的魅力了。他花了这么长时间,出了积累了很多计算机底层知识,肯定也对各种代码的逻辑认识很深。这是看到了很多代码得出的一种感性认识。我想,他不是那种不用努力就可以获得感性认识的人。

就像我很久以前的一位同学。那位同学的数学无敌。由此我在做题时,无意中听到她和朋友交谈。大致好像是她的朋友在向她问题,她反问朋友,难道你看到这个公式头脑中没有一种感性的认识吗?我当时不理解,直到经历了这种种才明白这其中的含义。

我想,linus就是这样一个没有天生感性认识的人。他的成功刚开始归于际遇,后来归于自己努力。

这是一个极客。是活在大家心目中的一名极客。

在反复尝试之后,指针变量,指针的内容,被我搞透了。

可能我就要把它讲出来吧。我累了,不想再运行这段代码了。。。

指针是变量。

int a = 0;
int b = 0;
int* p = NULL;
p = &a;
printf("%d\n",*p);
// let me think~~~
p = &b;
printf("%d\n",*p);

指针里面指向的内容代表什么?

int* p = NULL;
printf("%p\n",p);
int a = 0;
int* p = &a;
printf("%p\n",p);

代表地址啊。。。

如果没有给指针变量赋值,就赋值NULL.不赋值的情况它指向哪里我不管,反正开发中大家都是给NULL的。

要想让他有点意义,就给他赋他的那个类型的地址。&叫做取地址。

int*写到一块儿,就把他当成一种基本的数据类型就ok了。

就像这样,`int* p;,啊,int类型的指针,名字叫p。多么清楚。这样int *p`看着叫人头大。编译器都通过,关于C的困难,我想就是它的编译器太TM多,想要了解,还得了解编译器的历史,我TM就想写个代码没有bug,我管它那么多。。。可我还是管了。。。

函数中使用指针

int hanshu(int* p);
int main(void)
{
    int res;
    int* p = NULL;
    res = hanshu(p);
    return 0;    
}
int hanshu(int* p)
{
    *p = 150;
    int res = 200;
    return res;
}

函数中使用它,大体上是为了将在一运行就会销毁的内存区域将结果带出来而设置的。

以我多年的经验看,=左边的在栈里面。=右边的就在其他的内存模型里面。

好吧,写累了,不想写了。就这样吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值