-1

だから、私は構造を持っています

struct node
{
    node * l;
    node * r;
};

次に、

typedef node* tnode;

私が理解していないのは、この機能です:

void tsplit(tnode t, tnode &l, tnode &r, int x)

私が理解しているように、同じ型の構造体へのポインターの 2 つの参照を渡すよりも、構造体へのポインターとして渡しますttsplit()参照の代わりにポインターを渡すことができないのはなぜですか? 意味はありますか?

4

3 に答える 3

0

参照によりtsplit()、指されている内容 (それぞれtnode) だけでなく、ポインター自体を操作できます。関数はおそらくメモリなどを割り当てます。

これは、典型的/古典的な「参照による戻り」( out parameterとも呼ばれる) の問題であり、ここでの戻り値はポインターです。

于 2015-06-25T10:45:55.287 に答える
0

はい、それは理にかなっています。通常、参照はポインターとして扱うことができます (いくつかの制限があります)。したがって、例のポインターへの参照を変更できます。もちろん、構文も変更されますが、気にする必要はありません。あなたの例は次のようになります。

void tsplit(tnode t, tnode *l, tnode *r, int x)

lしたがって、違いは、 andの下にあるものは変更できますがrttypedef はそれを抽象化できますが、展開することはできます。

void tsplit(node* t, node** l, node** r, int x)

つまり、 の下にあるものは変更できますが、それ自体をt変更することはできません。これはと で行うことができます。つまり、 の参照先を変更することはできませんが、参照 (またはポインターへのポインター) への参照があるため、およびで変更できます。tlrtrl

ポインターよりも参照を使用する理由 ポインターは、オブジェクトの所有権の変更など、さまざまなことにも使用できるためです。構文は同じように見えますが、セマンティクスは大きく異なります。人々は物事がどのように見えるかを見るのが好きで、その背後にある意図と意味がすぐにわかります。つまり、構文からセマンティクスを差し引きます。参照は変数を渡すためにのみ使用できるため、見た目だけで何が期待できるかがわかります。

于 2015-06-25T10:53:21.437 に答える
-1

ええ、それは理にかなっています。 void tsplit(tnode t, tnode &l, tnode &r, int x) 内に新しいメモリを割り当てる場合

t = 新しい構造体ノードのように。

次に、ポインタへの参照として宣言した場合にのみ反映されます。

于 2015-06-25T10:30:57.597 に答える