temp2
、temp1
いくつかの構造体 x へのポインターです。
struct FunkyStruct x;
struct FunkyStruct *temp1 = &x, *temp2 = &x;
さて、次の行の実行後:
temp2=temp1;
temp1=temp1->nxt;
...同じメモリ位置を指し続けますかtemp2
? temp1
そうでない場合は、なぜそれらが異なるのかを説明してください。
最初は、temp1
とtemp2
の両方に のメモリ アドレスが含まれていますx
。
temp2 = temp1
temp1
は「 ~の値を代入する」という意味temp2
です。これらは開始時の値が同じであるため、このコマンドは何もしません。
この式temp1->next
は、「指すデータ構造の中を見てtemp1
、フィールドの値を返す」という意味next
です。したがって、 の値をにtemp1 = temp1->next
代入します。(もちろん、ルックアップは割り当ての 前に行われます。)フィールドにたまたま含まれていた値が含まれるようになりました。古い値と同じである場合もあれば、異なる場合もあります。temp1->next
temp1
temp1
next
これは Java のバックグラウンドに基づいた質問のように聞こえますか?
dysfunctorが与えた答えは良いです。
重要なことは、C ではポインターの割り当ては整数の割り当てと変わらないということです。
元のコードに次の変更を加えることを検討してください。
int temp1 = 1;
int temp2;
temp2=temp1;
temp1=temp1 + 1;
この temp1 の最後は 2、temp2 は 1 です。
Java で (非プリミティブ) オブジェクトを割り当てるのとは異なります。割り当てでは、値ではなくオブジェクトへの参照が実際に割り当てられます。
temp2 は更新されませんが、temp1 は次の項目を指します。したがって、temp1 が 0x89abcdef で temp1->next が 0x89b00000 の場合、完了後、temp1 は 0x89b00000 になり、temp2 は 0x89abcdef になります。
もちろん、リンクされたリストを作成していると仮定します。
あなたは質問に答えるのに十分な情報を提供していません。それらは同じ構造体を指し始めていますか、それとも両方とも構造体 x へのポインター型だけですか? また、構造体 x の場合、nxt フィールドの定義は何ですか?
違う。
temp1 が最初に指すアドレスを temp2 に保存しました。次に、temp1 が指す先の変数ではなく、temp1 が指す先を変更しました。
もしやっていたら
temp2 = temp1;
*temp1 = temp1->foo;
temp1 と temp2 は両方とも (同じ) 変更された変数を指します。
いいえ、C のようなポインターがあると仮定します。temp2 は x の場所を指し、temp1 は nxt ポインターが指すものを指します。通常、これは単一リンク リストのレイアウトです。
短い答えはノーです。ただし、最初にnxtがtemp1とtemp2の両方と異なる場合のみ。
行temp1=temp1->nxt; =演算子で区切られた 2 つの部分があります。これらは:
x (したがって x.nxt) は、コンパイラ、コンパイラ オプション、およびランタイム環境の組み合わせに応じて、指定されていない値に初期化されます。temp1 と temp2 はどちらも x を指します (temp1=temp2 の前後)。次に、temp1 には x.nxt の値が割り当てられます。
最終的な答え: 0 < Pr(temp1 == temp2) << 1、なぜなら temp1 == temp2 iff x.nxt == &x.