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

问题描述

我有以下代码

#include <stdio.h>

typedef void* myHandle;

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

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

    return 0;
}

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

另外,我想像 win32 API 一样使用 myHandle 和 HANDLE,我这样做只是为了学习 Windows 是如何做到的。据我所知, HANDLE 用于引用所有相关资源。我已经阅读了 win32 API 并看到了一个函数如何传递一个 HANDLE 变量以将创建的内容的地址附加到 HANDLE,这非常酷。

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

解决方法

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

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

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

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

,

要访问 from scripts import enemy 指向的值,您必须使用临时对象将指针转换为正确的类型:

void *

或使用演员表:

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

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

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

其中 printf( "%d\n",getIntFrom( Handle )); 知道如何通过该句柄访问 getIntFrom 值。