struct node
{
int data;
struct node *next;
};
次の2つの機能の違いは何ですか:
void traverse(struct node *q)
{ }
と
void traverse(struct node **q)
{ }
メインプログラムから上記の関数を呼び出すにはどうすればよいですか?
最初の引数リストは、へのポインターを渡します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;
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);
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++ では、次のことができます。
void traverse(node *& q)
あなたはそれらを次のように呼びます:
struct node* q;
//...
traverse(q); //calls first version
traverse(&q);//calls second version