数智应用帮
柔彩主题三 · 更轻盈的阅读体验

void指针怎么用?C语言里最灵活的指针操作实战

发布时间:2026-01-21 13:10:15 阅读:175 次

写C程序时,你有没有遇到过这种场景:函数要接收不同类型的数据,比如一会儿是int,一会儿是float,甚至是个结构体,但又不想写一堆重载函数?这时候,void *就派上用场了。

void指针到底是什么

void *不是“空指针”,而是“无类型指针”。它不关心自己指向的是什么数据,只存地址。就像快递员手里拿的包裹单——上面没写里面是衣服还是书,但地址清清楚楚。

正因为没类型,编译器不允许直接解引用:void *p; printf("%d", *p); 这行会报错。得先告诉编译器:“这其实是int”、“这是char数组”,再转成对应类型的指针。

常见用法一:通用内存操作

C标准库里的malloc返回的就是void *

int *arr = (int *)malloc(10 * sizeof(int));

这里强制转换不是可有可无——它告诉编译器:“这块内存我要当int数组用”。虽然C11以后可以省略括号(因为void*能隐式转为其他指针),但显式转换更清晰,也兼容老代码。

常见用法二:函数参数泛化

比如写个交换函数,不用为每种类型单独写:

void swap(void *a, void *b, size_t size) {
char temp[size];
memcpy(temp, a, size);
memcpy(a, b, size);
memcpy(b, temp, size);
}

调用时传地址和大小就行:

int x = 10, y = 20;
swap(&x, &y, sizeof(int));

double m = 3.14, n = 2.71;
swap(&m, &n, sizeof(double));

关键点:void *本身不能做算术运算(比如p++),但转成char *后就能按字节移动,所以很多底层函数内部会先转成char *来操作。

注意事项

别把void *NULL混为一谈。NULL是空地址常量,void *是可以指向任何有效内存的指针类型。另外,函数返回void *时,调用方必须明确知道该转成什么类型,否则容易读错内存——就像按int读float,结果可能是一串莫名其妙的数字。

实际开发中,像Linux内核、Redis底层、网络协议解析这些地方,void *满天飞。它不是炫技,而是让同一段逻辑适配多种数据结构的务实选择。