c - 如何使用 typedef void* 句柄取消引用变量?
问题描述
我有以下代码:
#include <stdio.h>
typedef void* myHandle;
int main() {
int a = 1;
myHandle Handle = &a;
printf("%d\n",*Handle);
return 0;
}
问题1:通常情况下,如果我有一个整数类型的指针,我可以使用解引用运算符并获取整数变量的值。但是,在这个例子中,我有一个 void 指针类型,我怎样才能取消引用它的内容?它给了我一个语法错误
另外,我想使用 myHandle,就像 win32 API 如何将它与 HANDLE 一起使用一样,我这样做的目的只是为了了解 windows 是如何做到的。据我所知,HANDLE 用于引用所有相关资源。我已经阅读了 win32 API 并看到了一个函数如何传递一个 HANDLE 变量以将创建的内容的地址附加到 HANDLE 中,这非常酷。
所以问题 2: : 如何将地址附加到我的句柄,然后像 win32 API 一样稍后访问它们?
解决方案
void *
通常用作指针的临时容器,以隐藏实际类型或灵活性。
例如,像 Windows 这样的系统可能有一些特定的类型用于句柄,比如一些名为foo
的类型,句柄是指向foo
对象的指针,类型为foo *
。由于各种原因,作者不想为您定义该类型。也许他们希望能够在未来的软件版本中改变类型,或者在不同的硬件上有不同的定义。或者他们只是不想透露它的细节,以便用户(大多数情况下)不会绕过它并破坏它。因此,当他们制作句柄时,他们会创建一个foo
对象并正常初始化它。然后,当他们将其提供给您时,作为某个例程的返回(直接或通过某个指向返回句柄位置的参数),他们将其转换为void *
.
这void *
为您提供了一个值,您可以在以后存储并返回给系统,但您不能(正确)修改或使用它来访问实际的foo
. 当您调用需要句柄的各种系统例程时,您会将其传void *
回,该例程会将其转换为 a foo *
,然后使用foo
它指向的。
因此,对于如何使用 avoid *
取消引用变量的问题,答案是将其转换回其原始类型,然后正常使用它。
推荐阅读
- datetime - 具有默认 DateTime 列的 Kusto 表
- twilio - 在 Twilio 无服务器函数中访问标头和原始请求正文
- python - 如何从一系列数值(包括 NaN)中过滤以仅保留以特定数字开头的数字
- python-3.x - 使用另一个数据框的数据框的条件样式
- javascript - 在项目数组中查找项目(对象 id ref)猫鼬
- computer-vision - CSGO 如何在地图中移动机器人
- python - 找不到 pyinstaller 命令
- javascript - 无法从 Javascript 中的输入类型数字标签中获取输入的数字
- javascript - vue-electron:如何在 prod 模式下关闭/最小化窗口
- javascript - 是否可以在 firestore 中获取第 n 个文档,或者在添加后为每个 firestore 文档分配一个编号?