1 void的意义
void修饰函数的参数和返回值的时候:
- 如果函数没有返回值应该将其返回值声明为void
- 如果函数没有参数,应该将函数的参数声明为void
- 如果没有参数,并且不声明为void,则函数参数默认是任意的,比如main函数
- 如果函数没有返回值,但是不声明为void,则函数默认返回值是int
如下图中的函数f(),它的返回值没有声明为void,默认是int,参数可以是任意多个。
注意:
- void的是为了表示函数参数和返回值为无。
- 从以上内容,也可以知道,C语言不是一门强类型语言。因为返回值不声明,就默认可以是int
1.1 不存在void变量
在之前的文章中,我们学过了C语言中的变量的意义:【C语言进阶深度学习记录】一 数据类型的本质与变量的本质 ,知道变量的意义在于一段固定大小内存的别名。但是void无法表示这么一段固定大小的内存,没有void的标尺,无法在内存中裁剪出void对应的变量,所以void无法声明变量。
比如下图的代码中,标出error的两行代码:
- 但是void* pv这一行没有标识错误。说明这样是可以的。后序会说明void指针的作用。
1.2 C标准
现在我们先要知道两个C标准
- ANSI C标准:标准C语言的规范
- 扩展C标准:不同的厂商在ANSI C标准上进行了扩充。
比如下面的代码,在ANSI C标准中是会出错的,但是在GNU的C标准中的gcc编译器是可以的,且sizeof(void)的大小是1 :
1.3 void指针的意义
void指针在C语言中具有很大的作用,首先我们需要知道:
- C语言规定,只有相同类型的指针才可以相互赋值
- void* 指针作为左值时,可以接收任意类型的指针
- void* 指针作为右值时,需要对它进行强制类型转换
1.4 通过void* 实现memset函数
- 代码:MemSet.c
#include <stdio.h>
void MemSet(void* src, int length, unsigned char n)
{
unsigned char* p = (unsigned char*)src;
int i = 0;
for(i=0; i<length; i++)
{
p[i] = n;
}
}
int main()
{
int a[5];
int i = 0;
MemSet(a, sizeof(a), 0);
for(i=0; i<5; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
- 编译运行结果为:
2 总结
- void是一种抽象的数据类型
- void类型不能用于定义变量
- void类型一般可以用于声明无参函数
- void类型也可以用于声明函数无返回值
- 可以定义void* 类型的指针
- void* 指针可以接收任意类型的指针值