2016-03-29 1 views
3

私はリンクリスト内のノードへのポインタを持っている:NULLにポインタを設定すると、指していた元のアイテムに影響しますか?

struct node *temp = head.next 

私はこのポインタを設定した場合のようなNULLに等しい:

temp = NULL; 

これも私が指していたノードに影響を与えるのだろうか?すなわちhead.nextNULLになりましたか?

+4

C++の参照変数を除いて、1つの変数を設定することは決して別の変数に影響しません。 – Barmar

+1

この質問は逆に尋ねることができ、本質的に同じです。 'struct node * temp = NULL; temp = head.next; '' NULL'は 'head.next'になりますか?もちろんそうではありません...それは絶対に意味をなさないでしょう。 – Sebivor

+0

私の答えに使った類推を調べてください。 :P:D –

答えて

9

これは私が指していたノードにも影響しますか?すなわち、head.nextはNULLになりましたか?


それをこのように考えてみてください。 head.nextは、値(アドレス)を保持する変数です。あなたは

struct node *temp = head.next 

を行うと今temphead.nextと同じ値を持っています。

その後、tempの値を変更すると、head.nextの値が変更されるのはなぜですか。


あなたは変数の値(何が起こっている。この場合である)をコピーしたときにこれが違いです、そしてあなたは、変数を作成し、いくつかの他の変数を参照し、その内容を変更します。


あなたは後者を望むなら、あなたはtempからもhead.nextの内容を変更したい場合は今、あなたは

によって行うことができます

struct node **temp = &head.next; 

ようpointer to pointer to struct node

何かを必要とします

*temp = NULL; 
4

いいえ、変更しなかったためポインタの内容

あなたはちょうど他のものを指すように彼に言った。

explain

+2

@Vucko @STF、芸術は私の意見で誤解を招いています。これは 'temp'が' head.next 'を指していることを意味しますが、実際には 'temp'と' head.next'はどちらも他のノード構造を指しています。 –

+0

@HassanNadeem、そうです - 私はそれを変更します – STF

5

いいえ、そうではありません。ポインターを更新するときには、その内容やポインターが指していたメモリーの場所を更新しないことを理解しておく必要があります。そのためには明示的に行う必要があります。あなたの問題のために今

tempはどこ頭部>次の常駐メモリ位置のアドレスを保持しています。何か(0x980901)のようにnullに設定すると、指していたアドレスだけが変更されます。今は何も指摘しません。

私はあなたにこのことを説明しましょう。あなたが紙を持っていて、それにあなたの友人の家の住所が書かれているとします。あなたはこの紙に書かれた内容を消すことはあなたの友人が彼の家から引っ越されたことを意味しますか?明らかにそうではありません。

あなたの場合、この用紙は一時ポインタです。

3

上記の回答はすべて非常によく説明されていますが、ポインタの学習を始めたばかりの人には分かりづらいかもしれません。

temphead.nextの両方は、タイプがstruct node *の変数です。ちょうどポインタを忘れて、struct node *の変数が両方ともintの場合、あなたの質問について考えてみてください。今すぐ戻ってあなたの質問に

int a = 1; 
int b = a; 
b = 0; 
// a remains 1, b is 0 

は、このアナロジーを参照してください

struct node* head.next = 1; // Some initial value 

struct node* temp = head.next; // temp now has the value of 1 
temp = NULL; // temp assigned the value of NULL, variable head.next remains unchanged 
1

ポインタを持つ魔法や特殊なものは何もありませんが、彼らは他の変数型と同じ規則に従います。

は考えてみましょう:

int x = 5; 
int y = x; 
y = 0; 

もちろんのy = 0;意志がxの値を変更しません。同じことがあなたの例にも当てはまります。

私はあなたが何とか指差しの変数の内容を変更することと混同していると思います。あなたの代わりに

int x = 5; 
int* y = &x; 
*y = 0; 

を行いたい場合次に*y = 0;xを変更します。しかしyは変更されず、まだ変更されません。x