在程序中,每一个变量都应该有相应的数据类型,数据的类型决定了编译器可以为之开辟多少的空间来存放数据。
例如:int类型需要4个字节,char类型需要1个字节,指针类型需要4个字节(32位系统下,64位需要8个字节)等等。
但C语言中还有一种特殊的数据类型——void。
1.void介绍
void表示为“无”、“空”、“没有”的意思。
在这里就把void理解为啥也不是。
作为一个数据类型,如果用void声明变量会是什么情况呢?
编译器要给数据分配多少的内存空间,是要依据变量定义时的数据类型。
而void类型比较特殊。虽然也是一种数据类型,但不确定性太强了。
如果可以用void声明变量,你要是开心先给个int整型的数据,不开心再给个char字符型的数据,或者double类型的数据。
这要求的内存空间一会儿大,一会儿小的,编译器也很难办。
内存就那么点,经不起这么折腾。
因此,void数据类型是不能直接用在变量声明的。
那么void应该被用在哪里呢?
2.函数的参数
void最常使用就是用在函数里面,第一个就是函数的参数。
通常会看到如下的函数原型定义:
这两个函数表示的意义是一样的,都是无参数、返回值为int类型的函数。
但有一点不同。根据不同的编译器,对语法检验严格程度也有所不同。用g++编译就有可能出现以下的情况:
参数部分为void的函数,在调用函数的时候,有传入实际参数的时候会产生报错,传入的参数太多了!实际上参数为void的函数是不能传入任何类型的参数。
而参数部分啥都没有的函数,调用函数的时候可以传入任意类型是不会报错的。
不过这个问题大体上没有人会这么做,因为毫无意义。
3.函数的返回类型
void的另一个作用,就是在函数的返回类型上面。
有时候,我们只需要函数运行的过程,而不是为了获取最后的结果。此时就可以使用void类型,表示该函数没有返回值。
例如:我只想交换a和b两个变量分别存储的数据。
运行结果:a=5,b=3
void定义的函数是没有返回值的,因此一般是可以不用加上return关键字。不过,即便加上也不会影响编译。
当然,如果函数里面有多种可能,需要中途结束。比如分支判断后结束,那么就要使用return关键字来终止函数。
例如:
void函数作为一个没有返回值的函数,既无法重新使用其他数据类型定义的变量来接收函数的返回值,也不能在printf函数中使用的。
4.void*指针
void*指针表示为无类型指针,作为一个指针类型,编译器已经为其妥善安排了4个字节的小房间。
因此,void*指针类型可以用来定义变量。
void*指针虽名为无类型指针,但可以指向任何一种类型的数据,即其他类型指针的指可以不通过强制转换直接赋给void*指针。
在C语言当中,对指针类型的转换要求不是那么严苛,可以不通过强制转换就可以进行相互间的赋值。
虽然编译器(gcc6.3版本)不会显示有错误,编译照常会通过。只是会给出类似下面的警告:
警告C“=”:从“float*”到“int*”的类型不兼容
而在C++当中,这一点要求就明显比较严格了。它不允许两个不同的类型指针相互赋值,除了void*指针。
其他的类型指针可以把值直接赋给void*指针,但反过来,void*指针的值想要赋值给其他类型的指针,也需要通过强制转换。
void*指针还有一个非常强大之处,在函数定义的时候,作为参数。当调用的时候,无论什么类型的类型指针或数组都可以正常运行。
不过void*指针也有一个致命的缺点,当对该指针进行算数操作,就会显示以下这个错误。
根据ANSIC标准规定,进行算数操作的指针,必须明确知道该指针所指向的数据类型大小。也就是所指向的数据,都必须是具体的类型,而不是空泛的void类型。
最后
关于C语言void数据类型的内容就到此结束了。
感谢各位的观看,如果您觉得本文章还不错,点个赞支持一下呗。
当然,如有发现不足之处,或者错误的地方,欢迎留言指出,不胜感激!