2

我在看一个用 C 语言编写的代码,它交换 wto 数字的位置,然后是两个结构。第二个没看懂:

#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所指向的任何内容。最后,您修改b为指向任何t指向的内容或 IOWa指向之前指向的内容。

所以,总而言之:你没有在结构*a和之间移动任何数据*b(其中*意味着取消引用指针),而只是交换指针ab.

于 2012-07-15T20:17:54.543 回答
2

这段代码暗示 a 和 b 都是 type 的指针NODE *。假设这两个结构如下: realA 是一个类型的结构,NODE由 a 指向;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

此代码交换两个指针并且不复制任何其他数据。这似乎是一个糟糕的宏名称; SWAP_NODE_PTR会更好。

于 2012-07-15T20:17:20.520 回答