今天我们来说一个内容,就是void这个关键字,这个的字面意思是 无类型,void* 则为无类型指针。
C语言volatile修饰的到底什么鬼?原来它在嵌入式开发是必须掌握的!
而我们不能写void a;去定义一个变量a,编译会报错:
原因是什么,网上没讲。网上只会说这个没有什么意义,其实我们直接分析就能得出结论,我们来看下:
int a;
double a;
这两个为什么能定义,其实原因在于int double 都有大小,也就是sizeof(type) 是能求出值的,所以就可以定义,而sizeof(void)是没法求出值的,所以没法用。
那么它存在的意义在哪里呢?如果我们函数不需要参数,怎么让编译器知道,就是用void,
比如 show(void);而如果我们不需要返回结果,就是 void show(void);
这样子编译器就知道,不需要为其处理参数,返回结果。这是它的第一个用法,就是代表不需要参数,不需要返回结果。
那么它的第二个作用,才是巨大的,我们经常使用申请内存,malloc,我们去看看它的原型:void *malloc(size_t size),这里返回结果是个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不能定义一个变量,因为大小未知
好了,今天就分享到这里,下一节我们来说下在C语言编程,工程里面的一个灵魂玩法,就是# ##,这两个预处理符号,很多人会用这个,来实现C++的父类,继承,和多态。我们慢慢来说~~
喜欢,帮忙转发~~
~~ end not end ~~
热门文章
职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!
我的微信 code_gg_boy 。