nullポインタを使用してパラメータを渡すことについて話しましょう。平衡二分木を書くとき、ノードが渡され、ノードが空を指しているため、他の場所がどのように変更されても、エラーが頻繁に報告されます。
1.通常のポインタ
通常のポインターの場合、ポインター自体がNULLの場合、それはnullを指していることを意味することを区別する必要があります。ただし、ポインターもデータであり、その2次ポインターはNULLではなく、このポインターのアドレスです。
void changeP(int** p)
{
int* p2 = (int*)malloc(sizeof(int*));
printf("p2的值为:%p \n", p2);
*p = p2;
}
int main()
{
int* ret = NULL;
printf("ret的地址为:%p \n", &ret);
changeP(&ret);
printf("ret的值为:%p \n", ret);
free(ret);
return 0;
}
第二に、構造ポインタ
これが人間の例です:
まだ例外を報告しています。
間違った理由:
ここでのpはNULLを指していますが、彼のアドレスは存在します。
setAge関数では、仮パラメーターもポインターです。
どちらも同じタイプです。
したがって、本質的に、これは値渡しのパラメーター渡しです。
このコードの問題:
関数が実行されると、まず、p1はヒープ領域で開かれ、解放されません。
次に、これは値渡しのパラメーター渡しであるため、main関数に戻った後も、pはnullポインターのままです。
当然、年齢はありません。
したがって、例外が報告されます。
変形:
または、第2レベルのポインターを使用して、第1レベルのポインターを操作します。
typedef struct People
{
int age;
}People,*P;
//p就是结构体指针。
void setAge(P* p1)
{
P p2 = (People*)malloc(sizeof(People));
*p1 = p2;
(*p1)->age = 5;
}
int main()
{
//Tree t = NULL;
//insert(t, 5);
//cout << t->data;
P p = NULL;
P* pp = &p;
setAge(pp);
cout << p->age;
free(p);
return 0;
}