数据结构与数据类型关系
数据结构与数据类型的关系是汉字与汉字笔划的关系。
数据类型是面向应用领域的具体化,同时面向计算机系统底层是为了确定分配的内存容量的大小。 在C,JAVA等静态类型的编程语言中,编译器根据数据类型,提前在内存的进程的栈中分配特定 大小的空间。C 的malloc,和Java的new是动态分配大块内存的,提前在内存的进程的堆中分配 计算过的内存空间。
javascript 等动态数据类型的编程语言中,并不需要声明数据类型,根据赋值情况,在解释器解释 执行代码中,动态得到相关的数据类型。
静态类型的语言,数据类型有严格的检查,程序不容易出错,执行性能也好,但是在编程中不够灵活 编程的抽象层次不够,因为有不少的应用,程序只有在实际的执行阶段才能最终确定数据的类型。 在这方面,C采用void *的返回类型来解决。Java和 C++等面向对象的编程语言使用泛类型的编程语法 来解决,这就是Java程序员津津乐道的反射技术。
在javascript ,python等动态类型的语言中,必须由程序员负责数据类型的强制转换,编程错误, 比较隐讳不易发现。
数据类型在编程的过程中,有一个数据的表示范围的问题,如果超出了范围,有数据溢出的问题。 这在系统底层的数学函数库的开发中,是一个重要的问题。
常规的整型,浮点型,数组,列表等类型仅能满足常规的分配内存的需求。对于像进程控制块这样的 复杂结构,还有ip协议的数据包的结构,需要用C语言的struct ,Java的class等抽象的数据类型进行 描述。在多个元素构成集合的情况下,数据类型是元素的一个属性。 元素之间的关系有线性关系与非线性关系,线性关系包括数组,链表。非线性关系包括树和图。 数组等数据结构不要求元素的唯一性,不要求元素的有序性。 集合要求元素的唯一性。再加上有序性是有序集合。
数据结构的重要作用,一个是设计内存中的数据分布的作用,方便数据的存取与操作。另一个作用是数据 的封装作用。这能有效的限制变量的作用域为一个特定的小范围内。在编程中,优先使用局部变量,全局 变量虽然在编程的时候,使用真得很方便,但它的副作用太大,例如有模块耦合问题,变量命名重复问题等。 C的struct,java的class 都能有效地实现,数据的封装。还能把相关的操作,一起封装起来,这是很重要的 编程进步。在C中把函数指针作为结构体的变量,来实现封装数据结构的操作。在java中用类的方法的方式, 把它封装起来。
C++ 与java等面向对象的编程语言都提供了类的继承,这是为什么呢?因为类与类之间有很多的属性与方法是 相同的。为了代码上的复用,编译器提供了相关的代码处理机制,实现了属性与方法只在父类中定义,在子类中 直接引用。这是有明显的编程开发上的好处的,类的继承机制,十分符合现实世界中的可继承的现象。 但它的问题是编译后的可执行程序庞大而十分冗余,内存占用极大,而且内存不易回收再利用。很容易存在内存泄漏的问题。 在使用C语言开发操作系统的蛮荒时代,内存泄漏问题就是一个顽疾。在java编程语言开发企业应用时 内存泄漏还是一个值得警惕的问题。虽然内存已经变得很庞大了。硬件的高性能只能掩盖问题,不能根治问题。