ポインターを値でポインターに渡すと、それ自体に割り当てるときと関数に渡すときに、ポインターが単一のポインターのように見えます。そのポインターがそれ自体を指すようにしたという理由だけで機能します。
あなたがやっていることは基本的にこれです:
void foo(void **p)
{
*p = "hahaha";
}
int main(int argc,char **argv)
{
void *p = NULL;
printf("%p\n", &p);
foo(&p);
printf("%s\n",(char *)p); // hahaha
printf("%p\n", p);
return 0;
}
いくつかのキャストとトリックが追加されています。「暗黒のカードトリック」と私は言いますが、実際のプログラムに入れるのは間違いなく良い考えではありません.
実際に質問に答えるには:はい、移植可能である必要があります。標準では、すべてのデータポインターを問題なく a との間でキャストできることが保証されているためvoid *
です (これは、コードで常に行っていることです)。
へのポインターvoid
は、任意の不完全型またはオブジェクト型へのポインターとの間で変換できます。不完全な型またはオブジェクト型へのポインタは、ポインタに変換されたりvoid
、元に戻されたりする可能性があります。結果は元のポインタと等しくなります。
(C99、§6.3.2.3.1)