Void(C语言)

一、Void无类型

① 基本概念

void 常用于函数返回值类型和函数的形参类型,
     如果函数不想要返回值,直接写return; ,函数返回值类型填void
     如果函数不想要形参,则形参位置填void.提高可读性

void Fun(void)
{
    
    return ;
}

void main(void)
{
    
    return ;
}

写代码的时候可以先考虑返回值,自己客观分析,你即将写的函数需不需要返回数据,不需要可以填 void

② void 的细节

判断题:
    无类型能定义变量?  无类型 是不能定义变量申请空间的。因为编译器都不知道你是什么类型,怎么申请空间
注意:void是无类型,void不能定义变量
    void不可以定义变量。

image

、void * 万能指针&通用指针

① 基本概念

void * 称为一级万能指针或者通用指针。
int a;
char b;
short c;
一级万能指针(无类型指针类型)只是书面上(字面上)的意思,一般指的是只存放基本类型变量的地址(一级地址)即。

一级指针变量存放一级地址。

② void * 为什么是万能的,通用的?

万能指针: 会转任意类型的指针,在不知道实参的类型是什么的时候,形参类型可以定义成__void *___ 。(这个是优点). 为了封装一个功能性能较强大的函数。
譬如:

#include <stdio.h>
#define DATA_TYPE_CHAR 0 //char
#define DATA_TYPE_INT  1 // int 
#define DATA_TYPE_STR  2 //char *
//我这个函数功能比较强大,我的一个形参能支持三种数据类型的数据进行传递
void All_Purpose_Printf(void * data_p,int data_type);
void All_Purpose_Printf(void * data_p,int data_type)
{

    if(data_type == DATA_TYPE_INT)
    {
        printf("%d\n",*(int *)data_p); //void * 属于无类型指针不能直接解引用
                                       //解引用:你提供一个地址去解引用,
                                       //编译器就会通过你给的地址和地址
                                       //的类型去获取对应大小空间
    }
    else if(data_type == DATA_TYPE_CHAR)
    {
        printf("%c\n",*(char *)data_p);

    }
    else if(data_type == DATA_TYPE_STR)
    {
        printf("%s\n",(char *)data_p);
    }
    else
    {
        printf("未知类型,无法输出\n");
    }

    return ;
}


int main()
{
    int  i_Data   = 12;
    char c_Data   = 'S';
    char * s_Data = "你好";

    All_Purpose_Printf(&i_Data,DATA_TYPE_INT); //这里强转提高可读性
    All_Purpose_Printf(&c_Data,DATA_TYPE_CHAR);
    All_Purpose_Printf(s_Data,DATA_TYPE_STR);

    return 0;
}

注意:类型转换要考虑空间一不一样,找一个和指针变量大小一样的类型去类型转换.

不考虑语法的底线:
    int a = 0x12;
    (int *)a;  4个字节的类型强转成8个字节 --- 报警高:大小不同的警告,把int类型改成8个字节的类型

③ void * 类型能定义变量进行赋值初始化,但是不能直接解引用

void * 变量,不能直接解引用,能直接赋值。void*是万能指针类型,万能指针类型void *能定义变量也能赋值但是不能解引用

#include <stdio.h>

int main()
{
    int a = 300; //1
    void * p= &a; //void *表示指针类型,但是不知道是哪一种指针类型,所以称为万能(可以转换成任意指针类型)指针类型

    printf("%d\n",*((char *)p)); // int * p;  *p 获取4个字节的空间  char *p; *p获取1个字节的空间
    //因为是万能指针,所以万能指针解引用会导致编译器不知道去访问多少字节的空间
    return 0;
}


int a = 11;
int * p = &a;
*p;//p进行解引用得到的是a变量(4个字节)
void * 类型解引用****编译报错

image

④ void* 类型的指针在编程中具有以下几个常见的用途和特点:

通用性:void* 可以作为函数参数或返回值,用于传递指向任何类型的数据的指针。这种特性使得它在编写需要处理多种数据类型的函数时非常有用,因为函数本身可以处理不同类型的数据。

类型安全:尽管 void* 可以指向任何类型的数据,但使用 void* 指针时需要注意类型安全性。因为 void* 指针没有类型信息,所以在使用时需要进行显式的类型转换(称为类型强制转换或类型适配),以确保在指针操作时不会导致类型错误或内存错误。

内存分配(malloc手动申请堆空间)和泛型编程:在需要处理未知类型数据或者需要动态地分配和管理内存时,void* 指针可以用于传递任意类型的指针。例如,在实现泛型数据结构(如链表、栈、队列等)时,可以使用 void* 来存储和操作不同类型的数据。

类型信息丢失:使用 void* 时,会丢失指向对象的具体类型信息。因此,需要在使用之前确保正确地将 void* 指针转换回特定类型的指针,以确保正确地访问和操作数据。
posted @ 2024-06-24 23:42  WJnuHhail  阅读(15)  评论(0编辑  收藏  举报