如何在C中交换两个结构

时间:2012-07-15 20:11:01

标签: c pointers struct swap

我正在查看一个用C语言编写的代码,该代码交换了wto数字的位置,然后是两个结构。我无法理解第二个:

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

为什么会有效?当我声明一些结构的t指针" Node"所以我直接指向a,然后b中的所有数据都被转移到a,而b指向a ...所以我得到它们都指向同一个对象(struct)。

如果我写:Node t = *a而不是,它不应该让它起作用吗?或者我错了..

谢谢!

4 个答案:

答案 0 :(得分:4)

在这种特殊情况下,您不会在结构之间传输任何数据。你只是在处理包含结构地址的指针。

首先,创建一个指针t,它开始指向a指向的任何内容。然后,修改指针a,使其指向b指向的任何内容。最后,您修改b以指向t所指向的内容,或指向a之前指向的内容。

所以,总结一下:你没有在结构*a*b之间移动任何数据(其中*意味着解除引用指针)但只是交换指针{{1 }和a

答案 1 :(得分:2)

此代码表示a和b都是NODE *类型的指针。假设两个结构如下:realA是NODE类型的结构,并由a指向; realB也是NODE类型,由b指向。现在你写这个:

NODE *t = a;

这里临时变量t是一个指针,分配给a,指向realA。现在,当你看到

a = b;

a不再指向realA,而是将地址存储在b中,所以现在指向realB。最后,同样地,

b = t;

推断现在b得到的指针存储在t中,而t又是realA的地址。

总而言之,只有指针的内容被改变了;实际数据未受影响。

答案 2 :(得分:1)

显而易见的猜测是,他们不会交换指针指向的东西,而只是指针本身。

答案 3 :(得分:1)

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