【void *】简单介绍

概要

void * 类型在 C 和 C++ 中表示一个指向未指定类型的内存地址的指针。

这意味着 void * 可以保存任何数据类型的地址。void * 通常用于泛型编程,即需要处理各种类型数据的函数或数据结构。

然而,由于 void * 是不完全类型,不能直接解引用或进行指针运算,必须先将其转换为另一种指针类型。

泛型函数示例

一个需要处理不同数据类型的函数可以使用 void *:

#include <stdio.h>

void printValue(void *ptr, char type) {
    switch (type) {
        case 'i':
            printf("%d\n", *(int *)ptr);
            break;
        case 'f':
            printf("%f\n", *(float *)ptr);
            break;
        case 'c':
            printf("%c\n", *(char *)ptr);
            break;
        default:
            printf("Unknown type\n");
    }
}

int main() {
    int i = 42;
    float f = 3.14;
    char c = 'a';

    printValue(&i, 'i');
    printValue(&f, 'f');
    printValue(&c, 'c');

    return 0;
}

在这个示例中,printValue 接受一个 void * 和一个类型标识符,然后在将 void * 转换为适当类型后打印值。

泛型数据结构示例

一个通用的链表可能会使用 void * 来存储任意类型的数据:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    void *data;
    struct Node *next;
}Node;

void append(struct Node **head, void *data) {//尾插法
    Node *new_node = (Node *)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        *head = new_node;
    } else {
        Node *temp = *head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = new_node;
    }
}

void printIntList(struct Node *head) {
    Node *temp = head;
    while (temp != NULL) {
        printf("%d -> ", *(int *)(temp->data));
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    Node *head = NULL;

    int a = 1, b = 2, c = 3;

    append(&head, &a);
    append(&head, &b);
    append(&head, &c);

    printIntList(head);

    // 在实际程序中记得释放分配的内存。
    return 0;
}

在这里插入图片描述
在这个示例中,append 通过尾插法向链表中添加新节点,结点的数据为 void * 类型,而 printIntList 将 void * 转换回 int * 以打印值。

重要注意事项

类型安全:

使用 void * 会移除类型安全,因此在进行类型转换时必须小心,确保转换为正确的类型。

指针运算:

不能对 void *指针进行运算,必须先将其转换为另一种指针类型。

解引用:

不能直接解引用 void * 指针,必须先将其转换为适当的类型。

小结

使用 void * 可以使代码更灵活,但也需要仔细处理以避免错误和未定义行为。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值