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