-5

ポインター句の正確な意味について質問があります。

私は次の方法を持っています:

myFunc(const void * p)
{
  ...
}

そして、それは次によって呼び出されています:

myStruct *st;
...
myFunc((char **)&st->arr);

私はポインターの経験がありますが、この場合、これらすべてのポインターとキャストでまだ迷子になっています..このケースがどのように機能するかについて正確な説明をお願いできますか?

ありがとう

4

3 に答える 3

1

これは質の悪いコードのようです! 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);

于 2013-07-15T09:07:42.517 に答える
0

ダブルポインターchar **を使用して myFunc メソッドを呼び出しており、同じことをconst void *ptrでキャッチしています。C では、void ポインターは (char */float */int */...) のような他のポインター型を保持でき、後で使用するときにそれらを型キャストできます。

したがって、ここで void ポインターは 2 文字ポインターを保持でき、後で void ポインターを 2 文字ポインターに型キャストできます。

    char **tempPtr = (char **)p;

ここで const 修飾子は、ポインタ p を定数データ ポインタとして作成します。これは、関数内で、それが指しているデータを変更しないことを意味します。

于 2013-07-15T09:38:23.073 に答える