簡體   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