-3

(struct in_addr **)との違いは何*(struct in_addr *)ですか?例を挙げて明確に説明してください。

4

2 に答える 2

6

(struct in_addr **)は、へのポインタへのポインタへの何かをキャストstruct in_addrしています。

*(struct in_addr *)は、へのポインタに何かをキャストし、struct in_addrそのポインタを逆参照します。


例:ポインタを受け取る関数があるとしvoidます。つまり、任意のポインタを受け取ることができ、それが実際には他の何かへのポインタであることがわかっている場合、そのポインタを正しいポインタタイプにキャストできます。

void some_fun(void *ptr)
{
    /* I know that `ptr` is really a pointer to a pointer to a `struct in_addr` */
    /* In other words, an array of pointers to `struct in_addr` */
    struct in_addr **addresses = (struct in_addr **) ptr;

    /* Do something with the array of pointers in `addresses` */
}

他の例:へのポインターを受け取る別の関数がありvoid、それがを指していることがわかっていて、struct in_addrポインターアクセスを使用せずにそれをプレーン構造に変換したい場合:

void some_other_fun(void *ptr)
{
    /* I know that `ptr` is really a pointer to a `struct in_addr` */
    /* Copy the data from that structure into my own structure */
    struct in_addr addr = *(struct in_addr *) ptr;

    /* Use `addr`... */
}

最初の例では、あるタイプのポインターが実際にはのタイプのポインターであることをコンパイラーに指示します。

2番目の例では、最初にポインターが別のタイプのポインター((struct in_addr *)パーツ)であることをコンパイラーに通知し、次にそのポインターを逆参照して、単項演算子を使用して実際の構造を取得します*


ここで使用されている型キャストは、古いCスタイルの型キャストであることに注意してください。C ++reinterpret_castでは、代わりに次のように使用します。

in_addr** addresses = reinterpret_cast<in_addr**>(ptr);
于 2013-03-13T05:57:45.457 に答える
2

(struct in_addr **)in_addrC スタイルのキャスト演算子で、その右側にあるものをすべて型(汎用ネットワーク アドレス)の構造体へのポインターへのポインターに変換します。

*(struct in_addr *)C スタイルのキャスト演算子の後に逆参照演算子 (右から左に読む) が続き、その右側にあるものを へのポインターに変換してから、in_addrそのポインターを逆参照します。

于 2013-03-13T05:58:49.890 に答える