在C语言中,变量variable的类型是定义得非常死板的。没有一个特殊类型的变量能被强制转换成其他的类型。或者任意类型的变量能直接强制转换成为一个特殊类型。的确,这样的特殊类型在C语言中是不存在的。
但是,我们可以找到一个特殊的指针去实现这样万能的转换。这样特殊的使命就交给一个最常用的,但是却最不理解的类型void*。没错,void是一个特殊的类型。说他特殊是因为你不能只样去定义 void a; 这样定义要不你不能使用这样变量b(TC2),要不就直接是编译出错(C-FREE)。实在是相当令人琢磨不透的东西。但是void类型的指针却是一个非常usefull的pointer。我们看下面一个例子:
#include "stdio.h"
int main(void){
void *p = NULL;
int a = 100;
p = &a;//任何类型的指针都可以转换为void*
printf("%d",*(int*)p);//输出的时候再强制转换回来
}
不知道路过的朋友看到这里会不会了解这样的功能究竟有什么用~我想大家都能猜测得到了,我将要这个特殊的指针去实现一般C语言实现不了的东西----面向对象。
我在学Java的时候突然领悟到,那些所谓在Java中的类其实不过都是一些结构体,Java中的类的创建、调用、传递、销毁、继承、接口等等操作无非都是对指针进行操作。既然C语言中也有指针,那为什么我不能用C语言来实现面向对象呢?OO In C
当然有些人会说,用一种语言去实现另外一种语言这不是很无聊吗?非也非也,面向对象和面向结构的区别仅仅在于是表现形式的不同。引用一句经典的话来说就是,石墨和钻石都是由同一种元素构成的,但是碳原子之间的组成方式不一样,表现就完全不一样了。此话甚为经典。