私は、リストの先頭にノードを追加し、新しいノードを格納する変数 "head"(リストの前の先頭を保持する)を変更する関数を作ろうとしました。リンクされたリストの頭が変わっていないのはなぜですか?
void addToStart(node * n, node * first){
printf("[Before adding] Node: %d, First: %d\n",&(*n),&(*first));
n->next = first;
first = n;
printf("[After adding] Node: %d, First: %d\n",&(*n),&(*first));
}
int main(){
node * head = createNode(0);
printf("This is the location of head: %d\n",&(*head));
node * fred = createNode(2);
addToStart(fred,head);
traverse(head); //Displays the list starting from the given node
return 0;
}
これが出力されます。
This is the location of head: 10113040
[Before adding] Node: 10113072, First: 10113040
[After adding] Node: 10113072, First: 10113072
(0)[10113040]->NULL
は、問題は、私はhead
がで指していた内容を変更する機能を期待していることであるが、実際には何も変わっていません。
'first = n'は' addToStart'の関数パラメータ 'first'を変更しますが、' main'の 'head'は変更しません。 'first'は' head'のコピーです。なぜなら、Cは値渡しでコピーだけが変更されるからです。 –
これは 'void f(int n){n = 0;}と同じ理由です。 } 'は、整数をゼロに設定するために使用することはできません。 Cのすべてのものと同様に、まずintの状況を理解してから、他のタイプに一般化してみてください。 –
あなたは 'int'状況については正しいですが、変数自体を保持するのではなく、変数を指すポインタではありませんか?私はポインタ変数を渡すと仮定し、ポインタを変更すると元の変数も効果的に変更されます。 –