void 是 C 语言中的一个关键字,它的字面意思是“空的”、“无”,在编程中,它主要有以下三个核心用途,理解了这三个用途,就基本掌握了 void 的精髓。

(图片来源网络,侵删)
用作函数的返回类型
这是 void 最常见的用途之一,当一个函数不需要返回任何值给调用者时,我们就将其返回类型声明为 void。
含义: 该函数执行完毕后,不返回任何值。
示例:
#include <stdio.h>
// 这个函数只负责打印信息,不返回任何值
void printWelcomeMessage() {
printf("欢迎来到 C 语言世界!\n");
// 函数体最后不需要 return 语句,或者可以写一个不带值的 return;
}
int main() {
// 调用这个函数,但不接收任何返回值
printWelcomeMessage();
return 0;
}
关键点:

(图片来源网络,侵删)
- 如果你尝试给一个
void类型的函数返回一个值,编译器会报错。void printWelcomeMessage() { printf("...\n"); return 123; // 错误!不能返回一个值 } - 在
void函数中,你可以使用 来提前结束函数,但不能跟任何表达式。void doSomething() { printf("开始工作...\n"); return; // 这是合法的,表示函数立即结束 printf("这行代码不会被执行"); // 死代码 }
用作函数的参数列表
当函数不接受任何参数时,我们可以在函数声明和定义中使用 void 作为参数列表。
含义: 该函数不接受任何传入的参数。
示例:
#include <stdio.h>
// 函数声明,明确表示这个函数不接受任何参数
void doSomething(void);
int main() {
doSomething();
return 0;
}
// 函数定义,同样使用 void
void doSomething(void) {
printf("这个函数不接受任何参数,\n");
}
关键点:

(图片来源网络,侵删)
- 在 C 语言中,空的括号 和带
void的括号(void)有细微区别:- 在 C++ 中, 意味着“可以接受任意参数”,而
(void)明确表示“不接受任何参数”。 - 在 C 语言中,虽然两者在很多编译器下效果相同,但使用
(void)是更规范、更清晰的做法,它能明确地向阅读代码的人(和编译器)表示这个函数设计上就不需要参数。
- 在 C++ 中, 意味着“可以接受任意参数”,而
错误示例:
void doSomething(void) {
printf("...\n");
}
int main() {
doSomething(10); // 错误!传递了一个参数给不接受参数的函数
return 0;
}
用作通用指针类型
这是 void 最强大但也最容易让人困惑的用途。void * 被称为“无类型指针”或“通用指针”。
含义:
void * 类型的指针可以指向任意类型的数据(如 int, char, struct 等),它不关心指针指向的对象是什么类型,只知道它是一个内存地址。
特点:
- 通用性: 任何类型的指针都可以隐式地转换为
void *类型,无需强制转换。 - 限制性:
void *类型的指针不能直接进行解引用(dereference),因为我们不知道它指向的数据是什么类型,也不知道要读取多少个字节(int通常是4字节,char是1字节),同样,void *指针也不能进行指针算术运算(如p++),因为编译器不知道要跳过多少个字节。
示例:
void * 通常用于函数参数,以实现可以处理不同类型数据的通用函数,C 标准库中的 memcpy 和 malloc。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// malloc 函数返回一个 void* 指针
// 它可以被赋给任何类型的指针,无需显式强制转换(C++需要,C语言推荐)
int main() {
int *p_int = (int *)malloc(sizeof(int)); // 在C语言中,(int*)可以省略,但加上更清晰
*p_int = 100;
printf("通过 int* 指针读取的值: %d\n", *p_int);
char *p_char = (char *)malloc(sizeof(char));
*p_char = 'A';
printf("通过 char* 指针读取的值: %c\n", *p_char);
// 释放内存时,同样使用 free(void*)
free(p_int);
free(p_char);
return 0;
}
*使用 `void ` 的自定义函数示例:** 下面是一个简单的“通用打印”函数,它打印一个内存地址上的内容,但需要调用者告诉它数据的类型和大小。
#include <stdio.h>
// 一个通用的打印函数,它接收一个 void* 指针和要打印的数据大小
void printGenericData(void *ptr, size_t size) {
unsigned char *p = (unsigned char *)ptr; // 将 void* 转换为 unsigned char*,以便逐字节访问
printf("内存内容 (十六进制): ");
for (size_t i = 0; i < size; i++) {
printf("%02X ", p[i]); // 打印每个字节的十六进制值
}
printf("\n");
}
int main() {
int num = 0x12345678;
char c = 'Z';
printGenericData(&num, sizeof(num)); // 传递 int 的地址和大小
printGenericData(&c, sizeof(c)); // 传递 char 的地址和大小
return 0;
}
输出:
(注意:字节序会影响输出顺序,x86是小端序,低位字节在前)
| 用法 | 含义 | 示例 | 关键点 |
|---|---|---|---|
| 函数返回类型 | 函数不返回任何值 | void myFunction() { ... } |
不能使用 return value; |
| 函数参数列表 | 函数不接受任何参数 | void myFunction(void) { ... } |
比空括号 更规范 |
| 通用指针 | 指向任意类型数据的指针 | void *ptr; |
不能直接解引用或算术运算,需要强制转换为具体类型后才能使用,常用于函数参数和返回值(如 malloc)。 |
void 在 C 语言中扮演着一个“占位符”或“通配符”的角色,用来表示“没有类型”、“没有值”或“没有参数”,从而增强了语言的灵活性和表达力。
