如何使用 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
值。
我有以下代码:
#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
值。