C语言中void究竟是什么意思?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 C语言 正文

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

在c语言中void是什么意思
(图片来源网络,侵删)

用作函数的返回类型

这是 void 最常见的用途之一,当一个函数不需要返回任何值给调用者时,我们就将其返回类型声明为 void

含义: 该函数执行完毕后,不返回任何值。

示例:

#include <stdio.h>
// 这个函数只负责打印信息,不返回任何值
void printWelcomeMessage() {
    printf("欢迎来到 C 语言世界!\n");
    // 函数体最后不需要 return 语句,或者可以写一个不带值的 return;
}
int main() {
    // 调用这个函数,但不接收任何返回值
    printWelcomeMessage(); 
    return 0;
}

关键点:

在c语言中void是什么意思
(图片来源网络,侵删)
  • 如果你尝试给一个 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是什么意思
(图片来源网络,侵删)
  • 在 C 语言中,空的括号 和带 void 的括号 (void) 有细微区别:
    • 在 C++ 中, 意味着“可以接受任意参数”,而 (void) 明确表示“不接受任何参数”。
    • 在 C 语言中,虽然两者在很多编译器下效果相同,但使用 (void) 是更规范、更清晰的做法,它能明确地向阅读代码的人(和编译器)表示这个函数设计上就不需要参数。

错误示例:

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 标准库中的 memcpymalloc

#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 语言中扮演着一个“占位符”或“通配符”的角色,用来表示“没有类型”、“没有值”或“没有参数”,从而增强了语言的灵活性和表达力。

-- 展开阅读全文 --
头像
dede 多个文章模板下载
« 上一篇 02-15
dede如何精准判断当前栏目id?
下一篇 » 02-15
取消
微信二维码
支付宝二维码

目录[+]