认识编程语言中的数据类型
编程语言中的数据类型主要包括两种:原始数据类型和面向对象的类型。
无论是在C、C++还是java中,原始数据类型基本上都是一个字节、两个字节、四个字节和八个字节的大小。其中还包括一个用于表示字符的一个类型,比如C/C++里边的char是一个字节,java里的char是两个字节。包括表示字符的类型在内,原始数据类型总是能够用来表示整数或浮点数等数值。其本质就是很小的一块连续的内存空间。
面向对象中的类型,以及C语言中的结构体(可以用typedef起别名使其看起来更像是一个简单的类型表示方法)不仅仅表示内存中的存储结构,同时常常用来封装数据。数据不在分散在程序的不同位置,维护起来更加方便。
类型主要包含两个意义:表示了数据的内存存储结构,限定了相关联的函数(方法)。
用类型表示存储结构,这种意义在C语言中体现更为明显,其中的结构体完整的体现了数据在内存中期望的存储大小、顺序等信息,唯一没体现的就是可能的字节对齐问题。看到一个结构体的定义,便可以知道他应该占用几个字节(不考虑字节对齐的时候),哪个位置的那几个字节分别用作什么、有多大。
C++中的类的成员变量的声明顺序依然能够体现数据的存储结构,不过有一些复杂的规则来适应面向对象的设计方法。
在java以及复杂的C++的类中,使用的是大量的指针指向数据而非直接在类型中规定了数据的存储结构。在使用指针的时候,类型表示数据的存储结构的能力就减弱了,内存不一定是连续的,数据成员在内存中的顺序也不重要了。此时如果一定要特定的连续内存空间,则使用字节数组而不像C语言使用结构体那么简单(适用C语言时如果结构体字节对齐的问题带来麻烦,那么也要使用动态内存分配获得字节数组来处理或分步读写结构体里边的变量)。
用类型限定相关联的函数,这样的意义在几乎所有的强类型编程语言中都适用。参数的类型不匹配则不能使用该函数,除非做类型转换,使其匹配。一个类型紧密相关联的函数常常作为该类型的成员函数(方法)出现,更容易访问数据。类型既规定了能使用的函数(其实是函数选择使用这些类型),也规定了不能使用其他的函数(其实是函数不接受这些类型),达到匹配数据和算法的目的。