C言語ポインタ[非常に間違いやすいポインタパラメータ転送の問題]

今日、平衡二分木を書いているときに、ポインターに関する問題が発生しました。最初に問題について話し合い、次に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次ポインターを渡す必要があります。

おすすめ

転載: blog.csdn.net/Kukeoo/article/details/114297006