【C】void * 指针在C中有哪些用法?

目录

1. 作为 通用指针(Generic Pointer)

2. 作为 函数参数,传递不同类型数据

3. 内存动态分配

4. 结构体中的 void *

5. 回调函数与 void *

总结


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. 内存动态分配

用法:函数如 malloccalloc 返回 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 = &num;
    wrapper.type = 1;
    if (wrapper.type == 1) {
        printf("Integer: %d\n", *((int *)wrapper.data));  // 将 void * 转换为 int *
    }

    // 将浮点数赋给结构体
    wrapper.data = &pi;
    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 * 是一个通用指针,可以指向任何类型的数据,但在使用时需要显式地进行类型转换。它常用于处理未知类型的数据、动态内存分配、回调函数等场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值