2

私は wto 番号と 2 つの構造体の場所を交換する C で書かれたコードを見ていました。私は2番目のものを理解できませんでした:

#define SWAP(a,b) do {NODE *t = (a) ; (a) = (b) ; (b) = t;}

なぜそれが機能するのですか?? いくつかの構造体「ノード」の t ポインターを宣言すると、 a を直接指すので、 b からのすべてのデータが a に転送され、 b も a を指します...したがって、両方が同じを指すことがわかりますオブジェクト (構造体) .

私が書いた場合 :Node t = *a代わりに、それは動作するべきではありませんか? または私は間違っています..

ありがとう!!

4

4 に答える 4

4

この特定のケースでは、構造間でデータを転送していません。構造体のアドレスを保持するポインターに取り組んでいます。

最初に、指しているtものを指し始めるポインターを作成しますa。次に、ポインターを変更aして、指していたものbを指すようにします。そして最後に、指しているものを指すように変更するか、以前に指していたものを IOW に変更bします。ta

つまり、要約すると、構造体*aとの間でデータを移動するのではなく*b*ポインターを逆参照することを意味します)、ポインターaとを交換するだけbです。

于 2012-07-15T20:17:54.543 に答える
2

このコードは、 a と b の両方が 型のポインターであることを意味しますNODE *。2 つの構造体を次のように仮定します。realA は型の構造体であり、NODEa によって指されます。realB も型NODEで、b によって指されます。これを書くと:

NODE *t = a;

ここで、一時変数 t はポインターであり、a に割り当てられ、realA を指します。今見たら

a = b;

a はもはや realA を指していませんが、b に格納されているアドレスを取得するため、a は realB を指すようになりました。最後に、同様に、

b = t;

は、b が t に格納されているポインターを取得すると推測します。これは、realA のアドレスです。

全体として、ポインタの内容のみが変更されています。実際のデータはそのままでした。

于 2012-07-15T20:19:17.433 に答える
1

明らかな推測は、ポインターが指すものを交換しているのではなく、ポインター自体だけを交換していることです。

于 2012-07-15T20:16:43.550 に答える
1

このコードは 2 つのポインターを交換し、他のデータはコピーしません。不適切なマクロ名のようです。 SWAP_NODE_PTRのほうがいい。

于 2012-07-15T20:17:20.520 に答える