繁体   English   中英

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

[英]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;
}

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

另外,我想使用 myHandle 就像 win32 API 如何将它与 HANDLE 一起使用,我这样做的目的只是为了了解 windows 是如何做到的。 据我所知,HANDLE 用于引用所有相关资源。 我已经阅读了 win32 API 并看到了 function 如何将 HANDLE 变量传递给 append 创建到 HANDLE 的内容的地址,这非常酷。

所以问题2::我怎样才能append 地址到我的句柄,然后像win32 API 一样稍后访问它们?

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

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

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

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

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

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

或使用演员表:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM