首先,知道什么是关键词?
C语言关键字_百度百科 (baidu.com)https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E5%AD%97void 是一个关键字也是一个变量,void 的字面意思是无类型,void* 则为无类型指针。
一、问题引出
(一)void 定义变量
而我们不能写void a;去定义一个变量a,编译会报错:
网络上都说这样用是没有什么意义,编译器不允许。
(二)int和double定义变量
int a;
double a;
二、自问自答
问①:这两个为什么能定义?
答:其实原因在于int double 都有大小,也就是sizeof(type) 是能求出值的,所以就可以定义,而sizeof(void)是没法求出值的,所以没法用。
问②:那么它存在的意义在哪里呢?
答:如果我们函数不需要参数,怎么让编译器知道,就是用void,
????????比如 show(void);而如果我们不需要返回结果,就是 void show(void);
????????这样子编译器就知道,不需要为其处理参数,返回结果。这是它的第一个用法,就是代
????????表不需要参数,不需要返回结果。
问③:那么它的第二个作用,才是巨大的,我们经常使用申请内存,malloc,我们去看看它的原型:void *malloc(size_t size),这里返回结果是个void*,为什么?
答:
因为我们申请空间回来,具体怎么用这段内存,是由我们自己决定,所以返回的类型,这个函数确定不了,所以就出现了void*,
再问:而为什么这个可以编译通过呢?不是void定义的变量都没有意义吗?
再答:
根据我们前面说的,sizeof(void*),是可以求出来结果的。我们发现sizeof(int*),sizeof(double *),sizeof(void*)的大小是一样的,原因很简单,这个是一个指针,指针里面存储的是一个地址,而地址只跟我们的寻址总线有关,比如32位的地址总线,就是占32位,默认来说,地址的大小,跟sizeof(int)是一致的,系统默认遵循,int的占用空间,跟地址总线一致。
所以,void* 是可以算出来大小的,也就是可以预知,有确定的大小和结果,于是就是可以去用的。我们常常把这个喊做万能指针,主要是因为,它可以随意的转换(当然你要明确知道你解析的是什么,否则会出现意外结果)
我们写一段代码:
我们在使用的时候,先将p转成对应的指针类型,再去读取值。为什么呢?因为我们真正要获取数据的时候,是需要知道它的大小的,否则编译器不知道该怎么拿数据。
三、总结void的用法
1 不需要参数时候,应该声明参数为void
2 不需要返回值,应该声明为void类型
3 void*指针默认不能++,原因是指向的void类型不知大小
4 如果返回需要任意类型指针,声明类型为void*
5 void不能定义一个变量,因为大小未知
四、一点思考
void不能代表一个真实的变量。下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
void a; //错误
function(void a); //错误
(1)void体现了一种抽象,像是一种哲学,这个世界上的变量都是 " 有类型的?" 。那么," 无类型 " 怎么体现,我们就用 void 来描述。世界上的东西都可以直观看出来,但也会有那么些东西不能直观看出来。
|