我们常说在c语言中void是空类型,就是没有类型。严格上讲这种说法是错误的。在C语言中无类型是不存在的,任何东西都有类型。
编程语言分为两种:强类型语言和弱类型语言。强类型语言中所有的变量都有自己固定的类型。这个类型有固定的内存占用,有固定的解析方法;而弱类型语言中没有类型的概念,全部变量都是一个类型(一般都是字符串的),程序在使用的时候根据需要处理这个变量。
c语言属于强类型语言,c语言中所有的变量都有明确的类型。因为C语言的所有变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这段内存的解析方法。
所以说数据类型的本质就决定了变量的内存占用书和内存的解析方法。在C语言中必须有确定的数据类型,如果一个变量没有类型(所谓的无类型)就会导致编译器无法给这个变量分配内存,也无法解析这个变量对应的内存,因此可以得出在C语言中不可能有没有类型的变量。
但是在C中可以有没有类型的内存。内存还没有和变量绑定,知道内存的字节数,可以不管内存中存储的内容。内存只有和具体的变量的相关联之后才有了具体的类型(其实内存本身是不知道的,但是编译器、运行时环境知道,当我们程序在使用这个内存时知道这个类型,所有会按照类型的含义去进行内存的读和写)。
void类型的含义时不确定类型,只是延迟绑定,现在还不知道而已。在描述一段没有具体 使用的内存时需要使用void;
举例:
malloc的返回值。malloc的作用就是向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存。malloc刚申请的这段内存尚未用来申请数据,我们无法啊知道这段内存将来存储什么类型的数据。所有malloc无法返回具体类型的指针,解决方法就是返回一个void *类型。所有我们可以给这段内存读写任意类型的数据。
void *类型指向的内存是尚未确定的类型,因此我们后续可以强制类型转换为任意类型。
void类型使用时一般都是于void *相关联的。因为有void类型的内存,无void类型的变量