有人可以给我一些解释,这部分代码是如何工作的,以及每个指针的含义。
void swapNode(node** A, node** B){
worker temp = (*(*A)).data;
(*A)->data = (*B)->data;
(*(*B)).data = temp;}
提前致谢。
答案 0 :(得分:2)
将两个指向指针的指针传递给函数:
void swapNode(node** A, node** B){
然后您复制节点A(node.data)
的数据worker temp = (*(*A)).data; //this is the same as (**A).data or (*A)->data and hopefully data is of the type worker...
将数据从B复制到A
(*A)->data = (*B)->data;
将第一步的副本写入**B
指向的节点(存储在* B和* B的指针位于存储在B中的地址)。
经典但非常复杂的交换。
(*(*B)).data = temp;
}
但通常最好只使用一个指针级别而不是两个指针。因为没有操作第一级引用的实例。您可以随处删除*
。
void swapNode(node* A, node* B)
{
worker temp = A->data;
A->data = B->data;
B->data = temp;
}
这更容易阅读和理解。
答案 1 :(得分:1)
请记住,a->data
是(*a).data
的简写,其中a
是指向结构或联合的指针,我们需要先取消引用指针访问data
成员。图形:
node * node
+---+ +---+
a: | | ----> | |
+---+ +---+
...
+---+
| | data
+---+
...
因此,(*(*A)).data
相当于(*A)->data
。
根据swapNode
的定义,它看起来如下所示:
node x, y;
...
node *xp = &x;
node *yp = &y;
swapNode( &xp, &yp );
如果您正在交换指针值(将xp
设置为指向y
而将yp
设置为指向x
,这是有意义的),但那不是swapNode
所做的;它只是在两个节点实例之间交换data
成员。
无论出于何种原因,编写此代码的人都决定添加一个完全不必要的间接级别。如果写的话,它也会起作用
void swapNode(node* A, node* B)
{
worker temp = A->data;
A->data = B->data;
B->data = temp;
}
并称为
node x, y;
...
swapNode( &x, &y );
答案 2 :(得分:0)
下面
void swapNode(node** A, node** B)
A和B都是指针类型节点的指针。
worker temp = (*(*A)).data;
这里首先解除引用(*A)
我们得到A
的值,这是node
类型的指针,因此在我们得到第二个解除引用(*(*A))
之后node
对象的值,所以我们通过对象检索data
中存储的值。
现在在下面的代码中: -
带有解除引用的 (*A)->data = (*B)->data;
我们检索A和B的地址都是指向node
类型的指针,因此->
我们检索了两者的数据成员并将B的数据值分配给甲