ポインター句の正確な意味について質問があります。
私は次の方法を持っています:
myFunc(const void * p)
{
...
}
そして、それは次によって呼び出されています:
myStruct *st;
...
myFunc((char **)&st->arr);
私はポインターの経験がありますが、この場合、これらすべてのポインターとキャストでまだ迷子になっています..このケースがどのように機能するかについて正確な説明をお願いできますか?
ありがとう
これは質の悪いコードのようです! const
プロトタイプにあるように、危険ではないかもしれません。
myFunc(const void * p)
何かへのポインターを受け入れ、const
それに触れないことを意味する必要があります。
現在、st
は へのポインタでありmyStruct
、メンバst->arr
の値もarr
メンバ&st->arr
のメモリ アドレスでもarr
あります。arr
が配列であると仮定すると、st->arr
値はすでにポインターです。
したがって、(char**)
はおそらく の正しい型であり&st->arr
、文字配列へのポインタです。そして、それが正しい型であれば、キャストする必要はありません!
データを別のデータとして処理するようにコンパイラに指示する必要がある場合は、キャストします。この場合、それは理にかなっていますmyFunc((const void *)&st->arr);
とにかく、myFunc に関する詳細情報がなくても、プログラマーの真の意図はmyFunc((const void *) st->arr);
ダブルポインターchar **を使用して myFunc メソッドを呼び出しており、同じことをconst void *ptrでキャッチしています。C では、void ポインターは (char */float */int */...) のような他のポインター型を保持でき、後で使用するときにそれらを型キャストできます。
したがって、ここで void ポインターは 2 文字ポインターを保持でき、後で void ポインターを 2 文字ポインターに型キャストできます。
char **tempPtr = (char **)p;
ここで const 修飾子は、ポインタ p を定数データ ポインタとして作成します。これは、関数内で、それが指しているデータを変更しないことを意味します。