C语言中的数据类型更深层次的理解
在现在的计算机语言中都有数据类型的概念,不同点大多只是在于类型强弱的区别,除此以外在本质上并无不同。
数据类型是对数据的抽象,类型是一种归类的概念,类型相同的数据具有相同的表示形式、存储格式以及相关的数据操作,程序中所使用的数据必然属于一种数据类型。
数据类型的产生实际上就是为了方便统一的在计算机语言中表达现实世界中的事与物。
数据类型的本质是计算机语言中规定好的固定内存大小的规则的别名,直白的说就是用于创建符合各种规范的变量(数据)的模板。
数据类型的作用包括用于编译器预算变量应该分配的内存空间的大小。举一个简单的例子,在C语言编程过程中,很多人都知道对于一个数组:int a[10];通过&a和直接使用a都能得到这个数组a的首地址,这看起来好像是没错的,而且大多数时候人们都这样用过,但就本质而言它们是不一样的。&a实际上得到的是整个数组的地址,而a代表的确是数组首元素的地址。这就是因为它们的数据类型不同的原因。那么问题来了,两者混淆会导致什么样的后果?a+1和&a+1带来的结果全然不同,混用会导致数据访问出错,如果是数据写入则会造成更为严重的后果。
数据类型可以通过typedef语法进行重定义(取别名)。
数据类型的封装是一种非常有用的实用技巧。与之相对应的是C语言中定义的无类型类型(void类型)和无类型指针(void*)。它们可以用于存储任何类型的数据和指向任何类型的数据。关于它们的使用最为常见的就是C语言库函数中定义的内存操作函数。C语言中不存在void类型的变量,但存在无类型类型(void类型)的数据。规定无类型指针(void*)类型变量作为接收数据的左值可以接收任何类型的数据,作为右值的时候必须经过转换才能赋值给其他确切类型。
C语言中函数本身也可以理解为数据类型,也可以进行重定义。这里的重定义并不是编译时报错的重定义,而是指函数的行为可以重定义,即函数回调。