在C中对结构使用双指针有什么用?

时间:2016-01-24 12:29:36

标签: c structure

我最近遇到了这个代码,用于构建一个队列,使用数组来存储二叉树的节点。

typedef struct node{
  int data;
  node *left, *right;
}Node;

Node** createQueue(int *front, int *rear)
{
  Node **queue = (Node **)malloc(sizeof(Node*)*500);
  *front = *rear = 0;
  return queue;
}

int main(){
  int rear, front;
  Node **queue = createQueue(&front, &rear);
  return 0;
}

队列形成期间双指针的用途是什么?

这是整个计划的链接:

http://www.geeksforgeeks.org/level-order-tree-traversal/

(方法2)

2 个答案:

答案 0 :(得分:1)

如果您有T类型的对象,例如

T x;

指向对象的指针将具有类型T *

T *px = &x;

在您的示例中,动态分配了一个500指针数组,指向Node类型的对象。也就是说,数组的每个元素都有Node *类型。

Node **queue = (Node **)malloc(sizeof(Node*)*500);

函数malloc返回数组第一个元素的地址。

由于动态分配数组的每个元素都具有类型Node *,因此指向数组的指针的指针将具有类型Node **

你可以通过以下方式想象它

typedef Node * T;

T *queue = ( T *)malloc( sizeof( T ) * 500 );

因此,如果您将T替换为Node *,您将获得

T      *queue = ( T      *)malloc( sizeof( T ) * 500 );
Node * *queue = ( Node * *)malloc( sizeof( Node * ) * 500 );

答案 1 :(得分:0)

"双指针"是"指向指针"的指针,从提供的摘录中很难说出为什么程序员决定他/她需要这样的结构。

可能是某些需要遍历整个树的任务,但不关心它的树状结构,所以这有助于避免递归(我的意思是可能需要修改这些,以便简单遍历单个 - 指针就足够了)