[英]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.