自我介绍范文网

当前位置:自我介绍范文网 > 文章阅读 > 读书笔记 > >

《C与指针》读书笔记一

来源::网络整理 | 作者:管理员 | 本文已影响

《C与指针》读书笔记一

  我平时不太看书。倒不是我没有读书的习惯。而是如今的社会知识传播的方式太多。书已经不是唯一知识的载体。至于“书是人类知识的阶梯”这句名言的时代已经过去了。每天各种微信公众号推介的文章已经够看了。特别是专业微信公众号内容特别丰富。所以我已经不看书好多年了。

本文引用地址:

  最近事情比较少,我在单位的书架上发现了一本《C与指针》这本书,常年闲置已经落满灰尘。我翻看了两章后,由于这本书年代久远,纸张已经非常脆弱。所以我上网订购了一本崭新的。我以后的半个月我浏览这本书。只能是浏览470多页的书要读一遍还是非常困难的。 所以我打算做一点读书笔记

  以前我以为这是一本非常那与理解的书,所以一直没有去翻阅这本书。现在觉得我的认识确实有点问题。作者在给这本书命名还是非常讲究的---《C与指针》。既然是“与”,那么在作者就介绍了两个方面---C&指针。

  在书的前5章介绍的是C语言的入门。因为C的基础知识比较少,所以作者只使用了不到100页的篇幅来介绍。包括“快速上手”、“基本概念”、“数据”、“语句”、“操作符和表达式”。虽然作者介绍的内容比较少,因为作者假设了读者已经对于语言有了基本了解。只是为了后面介绍指针做铺垫。但是足够入门学习了。因为作者的水平非常高,所以如果仔细品味定能事半功倍!

  其余18个章节的内容,除第14章《预处理器》、15《输入/输出函数》、16章《标准函数库》与指针没有明显关系外,其余都是指针或者指针延伸。因为只是面比较扩散,梳理起来当然比较麻烦。因为作者认为指针知识一个单纯的概念,指阵常用的方法即是指针和解应用,即 point与*point,这个非常容易理解。但是这个原理对编程工作效率是没有多少提高的。因为这个强调了指针的值和解引用的值,即指针的地址和指针地址中值地址所存储的值。这句话话来源于我的一位同事,读起来比较绕口,但是图解非常简单。

  int a = 102;

  int *Point ;

  Point = &a;

《C与指针》读书笔记一

  其实很多初学者认为指针比较难于理解,是因为可能对int a = 102;这句理解也不够全面。这也是C语言造成盲区----覆盖了硬件某些特点。如果是使用汇编编程,那么每个变量的地址必须自己安排,必须时刻记住了哪些地址已经被哪些变量使用。在C中编译器会替用户自动安排。这就节省用户很多精力,但是也会造成初学者不易理解。在这本书中作者介绍了“内存地址”、“值和类型”。虽然内容很简单,但是如果深刻理解,随后内容掌握将势如破竹。

  其实int a = 102;这条语句完成了两件事情,首先在RAM区划分了两个字节的空间。这个地址编码可能是0x00 12。为什么说“可能”。因为每个变量都有生命期,在他诞生时候系统只能根据当前RAM的使用情况划分一个空间。这个地址只能当前空闲的某个地址。

  其次在0x0012这个地址中内容更新为102.如果。如果只划分空间,那么空间的值将是不可预知的。应该为上次使用该空间时遗留的值。在这里我们就知道了a其实代表了一个地址,为了编写程序方便我们使用a来引用该地址空间和值。

  a = 105;这条语句是更新了a地址空间的值,更新为105。即0x0012地址空间的值现在为105。这里其实引出了另外两个概念---左值和右值。在此可以更加明确此处这个概念。一般情况先左值提供地址,右值提供值。

  我们可以通过作者提供简单例子来理解左值和右值。

  int a = 102;

  int b = 500;

  a = b;

  我们来分析以上三条语句。int a = 102; 划分地址0x0012,更新地址内容是102。

  Int b = 500; 划分地址0x1005,更新地址内容是500。如下图:

《C与指针》读书笔记一

  a = b; 是非常简单的一条语句,这条语句执行的结果就是a地址空间的值更新为b地址空间的值,即500。其实可以按照两个步奏来理解这条语句,首先,取b地址(0x00 15)空间的值500,其次将500存入a地址(0x00 12)空间。

  因为a、b都是变量,具有地址空间,a = b;是取b地址的值存入a地址。b提供值,a提供了空间。所以这也就明白了这个语句的正确读法应该是“将b的值赋给a”。这是省略的读法,扩充一下应该是“将b地址空间的值赋给a地址空间”。同理 b = a;也就非常好理解了。

  a = 5;这条语句是“将5赋给a”,也就是将a地址空间的值更新为5。a提供地址,5作为立即数提供了值。5 = a;显然是一条错误的语句。因为a可以提供值,但是5是立即数提供不了地址。

  所以在C中变量都代表了在其生命周期内一个固定的地址,在有了地址的概念,指针也就不难理解。

  int a = 102;

  int *Point ;

  Point = &a;

  该条语句也就完成两件事情,首先划定地址(0x0050)空间,在该地址空间插入a的地址(0x0012)。其次在地址0x0050内存入a变量的地址,值为0x0012。

  所以Point也是一个地址----0x0050,其值为0x0012。0x0050这个地址我们可以不关心,就像我们使用a,我们从来不关心a的物理地址(0x0012)一样。

  Point的值是0x0012,在这里0x0012也是一个普通的值,与100、200没有任何区别。所以这条语句也完全正确。

  Point = a;或者Point = 100;

  但是这做样做的意义何在,其实这种语句在实践中非常少见,而且还非常危险。

  我们不妨来分析一下。

  Point = a;是取a的值存入Point ,也就是取地址(0x00 12)中的值(102)存入Point(地址 0x0050)。

  Point = 100;将立即数100存入Point(地址0x0050)。但是这两条语句意义如果在解引用中将非常危险。

  Point = a;执行结束后,* Point 的值将是地址102处的值,* Point=22;将改变地址102中的值为22。地址102也许是其他变量的地址空间,这会造成整个系统的混乱。程序运行出现不可控的异常。

  Point = 100;执行结束后,* Point 的值将是地址100处的值,* Point=22;将改变地址100中的值为22。同样也会使系统出现紊乱,出现不可控的异常。所以非常危险。

  所以我们必须明白Point与*Point之间的关系。只要明白两者之间的关系,简单使用指针甚至排除指针造成问题也是可以的。

  理解C语言极其指针必须要有计算机系统的概念,只要有计算机简单模型思想。见瓶水之冰,而知天下之寒,鱼鳖之藏也;尝一脔肉,而知一镬之味,一鼎之调。


本文标题:《C与指针》读书笔记一
分享到: 更多

随机阅读TODAY'S FOCUS