2013-02-18 43 views
15

私はCで快適になってから、型キャストに遭遇しました。私は、次のように定義した場合* .hファイルで構造体へのvoidポインタのキャスト

struct data { 
    int value; 
    char *label; 
}; 

と、この別の* .hファイルで

私が使用できるように、私は構造体にボイドポインタをキャストするにはどうすればよい
# define TYPE  void* 

関数に渡される変数 "TYPE val"?たとえば、TYPE valが指す値を利用したい場合、その値を別の関数に渡すことができるようにキャストするにはどうすればよいですか?

+0

'#define TYPE void *'は悪い考えです。少なくとも、代わりに 'typedef'が必要です。次の宣言で何が起こるかを考えてみましょう: 'TYPE x、y;'または 'const TYPE x;'。 – jamesdlin

+1

また、 'void *'ポインタとCを扱っている場合、明示的なキャストは必要ありません。 Cでは、 'void *'ポインタを暗黙的に*キャストすることができます: 'void * p = ...;構造体データ* val = p; '。 – jamesdlin

+0

@jamesdlin私はそれが悪い考えであることに同意するが、それは私の考えではないので、私はそれと一緒に行かなければならない。したがって、 'TYPE val'がvoidポインタとして関数に渡されたときに、単に' struct data * temp = val; 'を宣言して関数にtempを渡すだけで、temp->値? – user1852050

答えて

19
(struct data*)pointer 

は、voidへのポインタをstruct dataへのポインタにキャストします。構造体への

+0

おそらく私はこれを打ちのめすことになりますが、上記の例では、これはTYPE valを構造体ポインタにキャストして、それが指す値になるようにするためです。(struct data *)ヴァル?これは正確には何ですか?私が先に進んで、変数 'int num =(struct * data)val'を宣言すると、valのポイントを取得するか、valが指し示すメモリアドレスだけが得られますか?後者の場合、どうすれば 'val'の価値を得ることができますか。 – user1852050

+0

@ user1852050あなたは構造体変数と構造体へのポインタ変数を混同しています。構造体へのポインタを取得する必要があるときは、 '&'演算子を使うことができます。 – wRAR

+0

私は宣言し、一時構造体のメモリを割り当て、それに&valの値を与えることができますか? temp =&valのように。そして、temp-> valueを使って値を取得しますか? – user1852050

-1

型キャストのvoidポインタは、私たちが uはその後、いくつかの関数に構造体変数として

このvptrを送りたいと言うことができます構造体への型キャストすることができ、このため

void *vptr; 
typedef struct data 
{ 
    /* members */ 
}tdata; 

を以下で行うことができます

void function (tdata *); 
main() 
{ 
    /* here is your function which needs structure pointer 
     type casting void pointer to struct */ 

    function((tdata *) vptr); 
} 

注:voidポインターの主目的である任意の型へのポインターを型キャストすることができます。

関連する問題