struct node
{
int data;
struct node *next;
};
以下两个功能有什么区别:
void traverse(struct node *q)
{ }
和
void traverse(struct node **q)
{ }
如何从主程序调用上述函数?
第一个参数列表传递一个指向 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);
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.
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