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

次の2つの機能の違いは何ですか:

void traverse(struct node *q)
{ }

void traverse(struct node **q)
{ }

メインプログラムから上記の関数を呼び出すにはどうすればよいですか?

4

3 に答える 3

7

最初の引数リストは、へのポインターを渡しますstruct nodestruct 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;

2 番目の引数 list は、ポインターへのポインターを へのポインターに渡します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:

関数の 2 つのバージョンの呼び出しに関しては、main構造体へのポインターが与えられた場合: struct node *arg;

  • 次のように最初のバージョンを呼び出すことができます。traverse(arg);
  • 2番目のバージョンは次のようになります:traverse(&arg);

あるいは、 として宣言された構造体を指定するとstruct node arg;、それへのポインターを作成できます。

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

その後:

  • 次のように最初のバージョンを呼び出すことができます。traverse(&arg);
  • 2番目のバージョンは次のようになります: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++ では、次のことができます。

 void traverse(node *& q)

あなたはそれらを次のように呼びます:

 struct node* q;

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