理解C中的指针

时间:2018-05-08 13:36:57

标签: c list pointers

有人可以给我一些解释,这部分代码是如何工作的,以及每个指针的含义。

void swapNode(node** A, node** B){
worker temp = (*(*A)).data;

(*A)->data = (*B)->data;
(*(*B)).data = temp;}

提前致谢。

3 个答案:

答案 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的数据值分配给甲