首页 > 解决方案 > 如何使用 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 一样稍后访问它们?

标签: cwinapihandle

解决方案


void *通常用作指针的临时容器,以隐藏实际类型或灵活性。

例如,像 Windows 这样的系统可能有一些特定的类型用于句柄,比如一些名为foo的类型,句柄是指向foo对象的指针,类型为foo *。由于各种原因,作者不想为您定义该类型。也许他们希望能够在未来的软件版本中改变类型,或者在不同的硬件上有不同的定义。或者他们只是不想透露它的细节,以便用户(大多数情况下)不会绕过它并破坏它。因此,当他们制作句柄时,他们会创建一个foo对象并正常初始化它。然后,当他们将其提供给您时,作为某个例程的返回(直接或通过某个指向返回句柄位置的参数),他们将其转换为void *.

void *为您提供了一个值,您可以在以后存储并返回给系统,但您不能(正确)修改或使用它来访问实际的foo. 当您调用需要句柄的各种系统例程时,您会将其传void *回,该例程会将其转换为 a foo *,然后使用foo它指向的。

因此,对于如何使用 avoid *取消引用变量的问题,答案是将其转换回其原始类型,然后正常使用它。


推荐阅读