リンクされたリストの先頭ノードでfoo(struct node *n)
ある関数を指定しました。n
ここで、リストの最後を指す stfoo
を変更する必要があります。n
しかし、これはこの関数シグネチャで可能ですか?
t
リストの最後へのポインターであると仮定します。
n = t
ポインターが値渡しされるため、機能しません。*n = *t
リストの先頭を上書きするため、機能しません。
私は何か見落としてますか?
リンクされたリストの先頭ノードでfoo(struct node *n)
ある関数を指定しました。n
ここで、リストの最後を指す stfoo
を変更する必要があります。n
しかし、これはこの関数シグネチャで可能ですか?
t
リストの最後へのポインターであると仮定します。
n = t
ポインターが値渡しされるため、機能しません。*n = *t
リストの先頭を上書きするため、機能しません。私は何か見落としてますか?
ポインターへのポインターを使用する必要があります。
foo(struct node **n)
何n
を指すかを変更するには、次のようにします。
*n = t;
いいえ、渡されたポインターの値のコピーがあるためです。渡された元のポインターにアクセスすることはできません。関数の外部でポインターを変更するには、sig を foo( struct node にする必要があります。 **n)。
あなたは何も見逃していません。指定された関数宣言では不可能です。
あなたが書いたように、ポインターは値で渡されるため、変更された場合、元の変数には反映されません。
プロトタイプをfoo(struct node **n);
orに変更し、struct node *foo(struct node *n);
結果として新しいポインターを返す必要があります。
いいえ、値で渡された引数を変更することはできません。
n
変更して発信者に変更を表示させることはできません。変更することはできn->prev->next
ますが、n->next->prev
それが必要な場合があります。
呼び出し元の関数に変更を反映することはできません。ですが、中foo
は思う存分着替えることができn
ます。
int foo(struct node *n) {
n = NULL; /* ok */
}