(struct in_addr **)
との違いは何*(struct in_addr *)
ですか?例を挙げて明確に説明してください。
2 に答える
式(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);
(struct in_addr **)
in_addr
C スタイルのキャスト演算子で、その右側にあるものをすべて型(汎用ネットワーク アドレス)の構造体へのポインターへのポインターに変換します。
*(struct in_addr *)
C スタイルのキャスト演算子の後に逆参照演算子 (右から左に読む) が続き、その右側にあるものを へのポインターに変換してから、in_addr
そのポインターを逆参照します。