Menu
CoddyTech

回顾 void 指针

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 49 课,共 61 课。

void* 是 C 用来表示“指向某个东西的指针,但我不告诉你它是什么”的方式。它可以保存任何数据类型的地址:int、float、结构体,或者其他任何东西。这使它成为在 C 中编写通用代码的基础。

但要注意,你不能直接解引用 void*。编译器不知道要读取多少字节,也不知道该如何解释这些字节。要使用这些数据,你必须将它强制转换回正确的类型:

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

这种灵活性也意味着你要承担相应的责任。如果你转换成了错误的类型,编译器不会阻止你,但程序会产生乱码或崩溃。因此,通用函数通常会将 void* 与类型标识符(例如枚举或标志)搭配使用,这样函数就知道如何正确解释数据。

在接下来的课中,你会使用 void* 来构建能够存储任意类型数据的容器,从而实现真正可复用的数据结构。

challenge icon

挑战

简单

编写一个名为 print_value 的函数,它接受两个参数:一个指向数据的 void* 指针和一个 int 类型标志。函数应根据类型标志解释并打印数据:

  • 如果类型标志是 0,将指针转换为 int*,并打印整数值
  • 如果类型标志是 1,将指针转换为 float*,并打印保留 2 位小数的浮点数值

程序会收到两个输入:

  1. 一个类型标志(0 表示整数,1 表示浮点数)
  2. 一个数值

根据类型标志,将数值存储在相应类型的变量中,然后调用 print_value,并传入指向该变量的指针和类型标志。

输入为 0 和 42 时的输出示例:

42

输入为 1 和 3.14 时的输出示例:

3.14

输入为 0 和 -17 时的输出示例:

-17

输入为 1 和 99.5 时的输出示例:

99.50

亲手试试

#include <stdio.h>

// TODO: 在这里编写你的 print_value 函数


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: 将指向 int_value 的指针和类型标志传给 print_value 函数
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: 将指向 float_value 的指针和类型标志传给 print_value 函数
        
    }
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器