我平常不太看书。倒不是我没有读书的习气。而是现在的社会常识传达的办法太多。书现已不是仅有常识的载体。至于“书是人类常识的阶梯”这句名言的年代现已过去了。每天各种微信大众号推介的文章现已够看了。特别是专业微信大众号内容特别丰厚。所以我现已不看书好多年了。
最近工作比较少,我在单位的书架上发现了一本《C与指针》这本书,终年搁置现已落满尘埃。我翻看了两章后,由于这本书年代久远,纸张现已十分软弱。所以我上网订货了一本簇新的。我今后的半个月我阅读这本书。只能是阅读470多页的书要读一遍仍是十分困难的。 所以我打当作一点读书笔记。
曾经我以为这是一本十分那与了解的书,所以一向没有去翻阅这本书。现在觉得我的知道的确有点问题。作者在给这本书命名仍是十分考究的—《C与指针》。既然是“与”,那么在作者就介绍了两个方面—C&指针。
在书的前5章介绍的是C言语的入门。由于C的基础常识比较少,所以作者只运用了不到100页的篇幅来介绍。包含“快速上手”、“根本概念”、“数据”、“句子”、“操作符和表达式”。尽管作者介绍的内容比较少,由于作者假设了读者现已关于言语有了根本了解。仅仅为了后边介绍指针做衬托。可是满足入门学习了。由于作者的水平十分高,所以假如细心品尝定能事半功倍!
其他18个章节的内容,除第14章《预处理器》、15《输入/输出函数》、16章《规范函数库》与指针没有显着联系外,其他都是指针或许指针延伸。由于仅仅面比较分散,整理起来当然比较费事。由于作者以为指针常识一个单纯的概念,指阵常用的办法便是指针宽和运用,即 point与*point,这个十分简略了解。可是这个原理对编程工作效率是没有多少进步的。由于这个强调了指针的值宽和引证的值,即指针的地址和指针地址中值地址所存储的值。这句话话来历于我的一位搭档,读起来比较绕口,可是图解十分简略。
int a = 102;
int *Point ;
Point = &a;
其实许多初学者以为指针比较难于了解,是由于或许对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。如下图:
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言语极端指针有必要要有计算机体系的概念,只需有计算机简略模型思维。见瓶水之冰,而知全国之寒,鱼鳖之藏也;尝一脔肉,而知一镬之味,一鼎之调。