[其它产品/技术] void 指针

[复制链接]
 楼主| 小夏天的大西瓜 发表于 2025-2-23 14:17 | 显示全部楼层 |阅读模式

想必大家一定看到过 void 的这些用法:


  1. void func();
  2. int func1(void);
复制代码

在这些情况下,void 表达的意思就是没有返回值或者参数为空。

但是对于 void 型指针却表示通用指针,可以用来存放任何数据类型的引用。

下面的例子就 是一个 void 指针:


  1. void *ptr;
复制代码

void 指针最大的用处就是在 C 语言中实现泛型编程,因为任何指针都可以被赋给 void 指针,void 指针也可以被转换回原来的指针类型, 并且这个过程指针实际所指向的地址并不会发生变化。

比如:


  1. int num;
  2. int *pi = #
  3. printf("address of pi: %p\n", pi);
  4. void* pv = pi;
  5. pi = (int*) pv;
  6. printf("address of pi: %p\n", pi);
复制代码

这两次输出的值都会是一样:


平常可能很少会这样去转换,但是当你用 C 写大型软件或者写一些通用库的时候,一定离不开 void 指针,这是 C 泛型的基石,比如 std 库里的 sort 函数申明是这样的:


  1. void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
复制代码

所有关于具体元素类型的地方全部用 void 代替。

void 还可以用来实现 C 语言中的多态,这是一个挺好玩的东西。



 楼主| 小夏天的大西瓜 发表于 2025-2-23 14:18 | 显示全部楼层
不过也有需要注意的,不能对 void 指针解引用

比如:

  1. int num;

  2. void *pv = (void*)#

  3. *pv = 4; // 错误
复制代码


为什么?

因为解引用的本质就是编译器根据指针所指的类型,然后从指针所指向的内存连续取 N 个字节,然后将这 N 个字节按照指针的类型去解释。

比如 int *型指针,那么这里 N 就是 4,然后按照 int 的编码方式去解释数字。

但是 void,编译器是不知道它到底指向的是 int、double、或者是一个结构体,所以编译器没法对 void 型指针解引用。
szt1993 发表于 2025-2-24 16:17 | 显示全部楼层
VOID指针用法非常经典
AdaMaYun 发表于 2025-2-25 12:32 | 显示全部楼层
void 指针很实用的
suncat0504 发表于 2025-2-25 22:07 | 显示全部楼层
void 指针最大的用处就是在 C 语言中实现泛型编程,因为任何指针都可以被赋给 void 指针,void 指针也可以被转换回原来的指针类型, 并且这个过程指针实际所指向的地址并不会发生变化。
suncat0504 发表于 2025-2-25 22:08 | 显示全部楼层
对void,编译器是不知道它到底指向的是 int、double、或者是一个结构体,所以编译器没法对 void 型指针解引用。
星辰大海不退缩 发表于 2025-2-26 16:29 | 显示全部楼层
void 指针最大的用处就是在 C 语言中实现泛型编程,因为任何指针都可以被赋给 void 指针,void 指针也可以被转换回原来的指针类型, 并且这个过程指针实际所指向的地址并不会发生变化。
发GV第几啊 发表于 2025-4-30 23:12 | 显示全部楼层
void 和 void* 是 C 语言中非常强大的工具,它们不仅用于表示无返回值或无参数的函数,还在泛型编程、数据结构实现和多态模拟等方面发挥着重要作用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

2243

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部