0
int i = 2;
int j = 8;
int *p = &i;
int *q = &j;

したがって、この時点で、p が 2 を指し、q が 8 を指していることは明らかです。

(*p) = (*q);

ここで、ポインター p は q を指し、q は j を指します。j = 8 なので、p は値 8 を指す必要があります。最後の部分は次のとおりです。

i++;
printf("%d %d\n", *p, *q);

これの出力は 9 8 です。ただし、p が q を指しているため、これを理解できません。ポインタ p は 8 を指しているため、この変更の影響を受けないはずではありませんか? 8 が 1 ずつ増えるのはなぜですか? p はもともと i を指していましたが、ポインタを q に変更したため、この結果はわかりません。

追記:皆様ありがとうございました。あなたの説明はすべて私にとって完全に理にかなっています。

4

6 に答える 6

2

pいいえ、ポインターが を指すようにしたい場合はq、次のようにする必要があります。

p = q;

また

p = &j;

この行:

(*p) = (*q);

以下と同じです:

i = j;

だから、あなたが作るとき:

i++;

これは次と同じです:

(*p)++;

これはあなたの出力につながります:

8 9

まだ( ) と ( ) とをp指しているためip = &iq = &ji = 9j = 8

于 2013-11-05T16:16:01.637 に答える
1

(*p) = (*q);

ここで、ポインター p は q を指し、q は j を指します。

pいいえ。 ;の値を変更していません。p を指すwhat の値を変更しました。値 8 (式 の結果*q) を変数 に代入しましたi

于 2013-11-05T16:16:12.780 に答える
0

間接演算子の仕組みを誤解してい*ます。

何が起こっているかは次のとおりです。ポインターから値へのマッピングは次のように始まります。

p -----> i (which is equal to 2)
q -----> j (which is equal to 8)

間接演算子*は、これを行うときに(*p) = (*q)、 が指す項目には が指すp値を割り当てる必要があると言うように機能しqます。上記のポインターの構成を考慮すると、結果は、行った場合とまったく同じになりますi = j

現在、状況は次のように変化しています。

p -----> i (which is now equal to 8)
q -----> j (which is still equal to 8)

最後に、 を実行するi++と、次のようになります。

p -----> i (which is now equal to 9)
q -----> j (which is still equal to 8)

そのため、8 と 9 が出力されます。

于 2013-11-05T16:18:00.367 に答える
0

いいえ、p は q を指していません。

(*p) は「p の内容」を参照するため、次のようになります。

(*p) = (*q) 

q の内容を p の内容にコピーしますが、p と q は変更されません。p と q は、メモリの 2 つの異なる場所を指します。

于 2013-11-05T16:18:22.193 に答える
0
(*p) = (*q);

qを指し、何を指しているかを割り当てますp。この場合、次と同等です。

i = j;
于 2013-11-05T16:15:55.443 に答える
0
p = q

qポインターを pointer に代入しますp。君の

(*p) = (*q)

を指す値を取り出し、それを がq指す場所に格納します。pどちらも を指しています8が、異なる8 を指しています。次に、それらの 1 つをインクリメントします。もう一方は影響を受けません。

于 2013-11-05T16:16:25.797 に答える