如何使用 typedef void* Handle 取消引用变量?

How to use typedef void* Handle to dereference a variable?

我有以下代码:

#include <stdio.h>

typedef void* myHandle;

int main() {
    
    int a = 1;
    myHandle Handle = &a;

    printf("%d\n",*Handle);
    

    return 0;
}

问题一: 通常,如果我有一个整数类型的指针,我可以使用解引用运算符并获取整数变量的值。但是,在这个例子中,我有一个 void 指针类型,我怎样才能取消引用它的内容呢?它给我一个语法错误

此外,我想使用 myHandle,就像 win32 API 将它与 HANDLE 一起使用一样,我这样做只是为了学习 windows 是如何做到的。据我了解,HANDLE 用于引用所有相关资源。我读过 win32 API 并看到函数如何传递 HANDLE 变量以将创建的内容的地址附加到 HANDLE,这非常酷。

所以 问题 2::如何将地址附加到我的句柄,然后像 win32 API 那样稍后访问它们?

void *一般用作指针的临时容器,既可以隐藏实际类型,也可以灵活使用。

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

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

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

要访问 void * 指向的值,您必须将指针转换为正确的类型,或者使用临时对象:

int *tmp = Handle;
printf( "%d\n", *tmp );

或使用强制转换:

printf( "%d\n", *((int *) Handle));

请注意,“句柄”类型通常并不意味着直接取消引用。它们通常只是传递给知道如何处理它们的 API,例如

printf( "%d\n", getIntFrom( Handle ));

其中 getIntFrom 知道如何通过该句柄访问 int 值。