今日、平衡二分木を書いているときに、ポインターに関する問題が発生しました。最初に問題について話し合い、次にAVLツリーを書き直してみましょう。
エラーが発生しやすいポイント:渡されたパラメーターがポインターであるとは思わないでください。アドレスで渡す必要があります。
古典的な例を挙げてください。
交換機能
void mySwap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
ここで、パラメータをアドレスでaとbに渡したい場合は、仮パラメータをポインタの形式で記述する必要があります。
これは元のスペースを操作できるため、それ以外の場合は常に元の値のコピーになります。
ただし、ポインタパラメータを渡すのではなく、元の値を変更できます。
次の場合を見てください。
int* givP()
{
int* p = (int*)malloc(sizeof(int*));
return p;
}
void changeP(int* p)
{
int* p2 = (int*)malloc(sizeof(int*));
p = p2;
}
int main()
{
int* ret = givP();
printf("%p ", ret);
changeP(ret);
printf("%p ", ret);
free(ret);
return 0;
}
最初に関数givPを作成し、retにアドレスのブロックを割り当てました。
次に、関数を作成しました。この関数で受け入れられるパラメーターもポインターです。関数の本体で、新しいアドレスを作成し、それをpに割り当てます。
retの値を2回出力します。
答えは変わりません。
どうして?このポインタは他のポインタではないからです。
元のポインタは数値を指しています。
そして、ここでのポインターはパラメーターになり、それ自体のタイプはポインターです。
したがって、変更する場合は、セカンダリポインタを使用して保存する必要があります。
このように書いてください:
int* givP()
{
int* p = (int*)malloc(sizeof(int*));
return p;
}
void changeP(int** p)
{
int* p2 = (int*)malloc(sizeof(int*));
*p = p2;
}
int main()
{
int* ret = givP();
printf("%p ", ret);
changeP(&ret);
printf("%p ", ret);
free(ret);
return 0;
}
もう一度見てください:
アドレスは正常に変更されました。
したがって、将来コードを作成するときは、オントロジーを見つけることに注意を払う必要があります。見つかった本体がポインターであり、ポインターもパラメーターによって渡されるためではありません。代わりに、この時点でのポインターはオントロジーであるため、2次ポインターを渡す必要があります。