目录
1. 作为 通用指针(Generic Pointer)
用法:void * 可以作为通用指针,指向任何类型的数据。通常我们使用它来处理不确定数据类型。

代码:
#include<stdio.h>
int main(){
int x = 314;
float y = 3.14;
void *ptr ;
ptr = &x;
printf("Integer: %d \n",*((int *)ptr));
ptr = &y;
printf("Float: %.2f \n",*((float *)ptr));
}
void *ptr 是一个通用指针,可以先指向一个整数,再指向一个浮点数。通过类型转换((int *) 或 (float *)),我们可以正确访问它们的值。
2. 作为 函数参数,传递不同类型数据
用法:使用 void * 作为函数参数,可以让一个函数处理不同类型的数据。

代码:
#include<stdio.h>
void printValue(void *ptr,char type)
{
if ( type == 'i' )
{
printf("Integer: %d \n",*((int *)ptr)); // 将 void * 转换为 int *
}
else if ( type == 'f')
{
printf("Float: %.2f \n",*((float *)ptr)); // 将 void * 转换为 float *
}
}
int main(){
int x = 5;
float y = 3.14;
// 传递 int 类型的数据
printValue(&x,'i');
// 传递 float 类型的数据
printValue(&y,'f');
}
printValue 函数接受一个 void * 参数,可以传递任何类型的数据。函数通过 type 参数判断数据类型,然后将 void * 转换为正确的类型并进行处理。
3. 内存动态分配
用法:函数如 malloc 和 calloc 返回 void * 类型的指针,这些指针指向分配的内存块,可以存储任何类型的数据。

代码:
#include <stdio.h>
#include <stdlib.h> // 需要包含 stdlib.h 以使用 malloc 和 free
int main() {
// 动态分配 10 个整数的内存
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
// 如果 malloc 返回 NULL,表示内存分配失败
printf("Memory allocation failed\n");
return 1;
}
// 使用分配的内存
for (int i = 0; i < 10; i++) {
arr[i] = i * 10;
printf("%d ", arr[i]);
}
// 释放分配的内存
free(arr);
return 0;
}
malloc 返回一个 void * 指针,它被强制转换为 int * 来指向整型数据。通过这个指针,可以操作分配的内存。
4. 结构体中的 void *
用法:结构体中可以包含 void * 类型的指针,这样可以让结构体灵活地存储不同类型的数据。

代码:
#include <stdio.h>
typedef struct {
void *data;
int type; // 1 - int, 2 - float
} DataWrapper;
int main() {
DataWrapper wrapper;
int num = 123;
float pi = 3.14;
// 将整数赋给结构体
wrapper.data = #
wrapper.type = 1;
if (wrapper.type == 1) {
printf("Integer: %d\n", *((int *)wrapper.data)); // 将 void * 转换为 int *
}
// 将浮点数赋给结构体
wrapper.data = π
wrapper.type = 2;
if (wrapper.type == 2) {
printf("Float: %.2f\n", *((float *)wrapper.data)); // 将 void * 转换为 float *
}
return 0;
}
结构体 DataWrapper 包含一个 void * 指针,可以存储任意类型的数据。通过 type 字段判断数据类型,并将 void * 转换为相应类型进行操作。
5. 回调函数与 void *
用法:void * 可以用于回调函数中,以传递任意类型的数据。

#include <stdio.h>
void callback(void *data) {
printf("Callback received: %s\n", (char *)data); // 假设传递的是字符串
}
int main() {
char *message = "Hello, world!";
callback((void *)message); // 将字符串转换为 void * 并传递给回调函数
return 0;
}
callback 函数接受一个 void * 参数,并假设它指向一个字符串。通过类型转换,我们可以将其转换为 char * 来处理。
总结
void * 是一个通用指针,可以指向任何类型的数据,但在使用时需要显式地进行类型转换。它常用于处理未知类型的数据、动态内存分配、回调函数等场景。

898

被折叠的 条评论
为什么被折叠?



