《The C Programming Language》 读后感

因学习需要,笔者在周末又拿出这本大一学的C语言程序设计通读了一遍,一共用时3天,可以说只是泛读,不是很仔细.

先说说收获吧,由于之前大一时学习不甚认真,导致一些基础的东西掌握不扎实,此次通读后,感觉很多认知观都刷新了.C语言确实是了解底层的最好的语言,一些学习Java的不太清晰的点现在有了了解.

再谈谈C的左膀右臂:强转和指针.强转是指由一种抽象结构强行变成另一种抽象结构,说它是左膀其实感觉有点言过其实,可能是笔者水平的原因,在一些方面看来,指针的作用比强转大多了,在没有指针的情况下,想在C语言这样的结构型编程语言中改变一个形参的值,可能只能通过构建一个数组来完成,因为数组是传递的首地址.从这点角度来看,数组其实也能看成一种指针.指针的作用远不止如此,在C语言中,数组是固定长度且不能改变大小的(跟Java一样,当然,我们不谈JS),这是因为给数组大小就是申请内存的过程,使用:

length*sizeof(Type)

来确定分配的内存,而有些操作必须要不限制长度的数组,C语言封装了在heap上的动态数组来实现的.但是如果能写入一个数据就动态的给予内存,内存在物理上不连续(其实就是链表啦...),利用底层语言的内存优势,写一个更好的ArrayList就好了.
解决这个问题,可以使用结构体里面写入指针来存储链表下一个内存的物理地址,同时,用一个基础类型存储一下数据(也可以嵌套结构体来完成更复杂的链表),这样,指针的另一个特色:固定长度的优势就发挥出来了.为什么是固定长度的优势呢?因为如果把指针改成链表的下一个结构体来的话,结构体会出现语法错误,结构体不能包含本结构体成员,自身结构体的内存字节数不确定.

最后说说某些疑惑的地方,可能只是因为没仔细读.第一是函数指针,讲解过少,笔者认为这个指针会在某些场合内大放异彩,是构建一个强扩展程序的必要组件.第二是构建图,树等其他数据结构,本书没有提及.第三是指针,本书于第九章提出指针概念后,后面几乎每一章讲此章内容与指针的关系,为此引申出新的指针子类出来,但是由于没有总体的归纳,可能会使学生知识体系架构不算清晰.最后是一个小点:在动态数组里malloc()与calloc(),从安全角度calloc更好,但是书中没有在其他地方使用过,可能是malloc()更灵活的缘故吧.

最近又买了《C和指针》《C 陷阱与缺陷》来精读,提高对C语言认知与底层操作的理解.

你可能感兴趣的:(《The C Programming Language》 读后感)