void 表示不确定的类型,与确定的类型不同,比如int,我们能知道它占用内存空间4个字节


一、空指针(void *)类型

void *为空指针类型,void表示具体类型不确定,所以void *指针就是一个纯粹的指针,无法被解引用,
如果想需要解引用的话,必须强制转换为 int * / float * 等具体类型的指针之后,才能解引用

int a = 100;
void *p = (void *)&a;

*p = 200;

编译时会提示*p = 200为无效操作

: warning: dereferencing 'void *' pointer
     *p = 200;

error: invalid use of void expression

二、空指针 (void *) 的意义

我们这里直接通过例子来看一看void *的意义。

#include <stdio.h>
#include <string.h>

struct student
{
    int num;
    char name[20];
};

void init_fun(int type, void *addr)
{
    if(type == 1)
    {
        *((int *)addr) = 100;
    }
    else if(type == 2)
    {
        *((double *)addr) = 2324.56;
    }
    else if(type == 3)
    {
        ((struct student *)addr)->num = 9527;
        strcpy(((struct student *)addr)->name, "zhangsan");
    }
}

int main(void)
{
    int a = 0;
    double b = 0.0;
    struct student c = {0};

    init_fun(1, (void *)&a);
    printf("a = %d\n", a);

    init_fun(2, (void *)&b);
    printf("b = %lf\n", b);

    init_fun(3, (void *)&c);
    printf("num = %d\n", c.num);
    printf("name = %s\n", c.name);

    return 0;
}

传递指针时,将指针强制转换为void *,通过这种方式就可以兼容的传递各种不同类型的指针

从这个例子可以看出,传参时使用void *可以让传参变的很灵活,后面还会再次提到这一点


三、malloc 函数返回指针的就是(void *)

malloc只负责开辟空间,并返回空间第一个字节的地址,也就是空间的指针,至于如何解释这个空间,
这个应该由程序员自己决定,所以malloc返回void *的指针,程序员需要根据需求将其强制转换为具体类型的指针

1)malloc 的函数原型

#include <stdlib.h>
void *malloc(size_t size);

2)使用举例

int *p = (int *)malloc(4);