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* 指针可以接收任意类型的指针值