回顾 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* 来构建能够存储任意类型数据的容器,从而实现真正可复用的数据结构。
挑战
简单编写一个名为 print_value 的函数,它接受两个参数:一个指向数据的 void* 指针和一个 int 类型标志。函数应根据类型标志解释并打印数据:
- 如果类型标志是
0,将指针转换为int*,并打印整数值 - 如果类型标志是
1,将指针转换为float*,并打印保留 2 位小数的浮点数值
程序会收到两个输入:
- 一个类型标志(
0表示整数,1表示浮点数) - 一个数值
根据类型标志,将数值存储在相应类型的变量中,然后调用 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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器