2
struct node
{
 int data;
 struct node *next;
};

以下两个功能有什么区别:

void traverse(struct node *q)
{ }

void traverse(struct node **q)
{ }

如何从主程序调用上述函数?

4

3 回答 3

7

第一个参数列表传递一个指向 a 的指针struct node。这允许您更改struct node函数主体中的 。例如:

// this will change the structure, caller will see the changes:
q->data = newValue;

// but this will only change q in the function, caller WON'T see the NULL:
q = NULL;

第二个参数列表将指针传递给指向 a 的指针struct node。这使您不仅可以更改struct node函数体中的 ,还可以更改指针指向的。例如:

// this will change the structure, caller will see the changes:
(*q)->data = newValue;

// This will change the pointer, caller will now see a NULL:
*q = NULL:

至于调用函数的两个版本,从main或以其他方式:给定一个指向您的结构的指针:struct node *arg;

  • 你可以这样调用第一个版本:traverse(arg);
  • 第二个版本是这样的:traverse(&arg);

或者,给定一个声明为 的结构struct node arg;,您可以创建一个指向它的指针:

struct node arg;
struct node *ptrToArg = &arg;

进而:

  • 你可以这样调用第一个版本:traverse(&arg);
  • 第二个版本是这样的:traverse(&ptrToArg);
于 2012-08-08T19:09:27.653 回答
4
void traverse(struct node *q)
{ }

接受一个指向结构的指针。你可以这样称呼它:

struct node A;
traverse(&A);

这个功能

void traverse(struct node **q)
{ }

获取指向结构的指针的指针。你可以这样称呼它:

struct node A;
struct node* Aptr = &A;
traverse(&Aptr);

如果您想修改传递给函数的原始变量,传递指针很有用,例如,如果您有这样的函数:

void setToNull(struct node ** q){
   *q = NULL;
}

然后你可以这样做:

struct node A;
struct node* Aptr = &A;
setToNull(&Aptr);
// Aptr is now equal to NULL.
于 2012-08-08T19:12:15.377 回答
2
 void traverse(struct node *q)

只需传递一个指向函数的指针。

 void traverse(struct node **q)

将指针传递给指针,因此您可以更改原始指针。它是 C++ 通过引用传递指针的 C 等效项。在 C++ 中,你可以这样做:

 void traverse(node *& q)

你可以称它们为:

 struct node* q;

 //...
 traverse(q); //calls first version
 traverse(&q);//calls second version
于 2012-08-08T19:10:27.110 回答