int y=1;
int k=2;
int *p1;
int *p2;
p1=&y;
p2=&k;
p1=p2;
*p1=3;
*p2=4;
printf("%d",y);
出力が1になっています。誰かが理由を説明してくれませんか!! 4になると予想していました。
以下のコメントは、これがどのように機能するかを説明しています。
int y=1;
int k=2;
int *p1;
int *p2;
p1=&y; //pointer p1 holds the address of y
p2=&k; //pointer p2 holds the address of k
p1=p2; //pointer p1 now holds the address which p2 holds, which is the address of k
*p1=3; //the value which p1 points to is now 3 (so k equals 3 as well)
*p2=4; //the value which p2 points to is now 4 (so k equals 4 as well)
printf("%d",y); //y is still 1
ただしprintf("%d",k);
、値 4 を実行すると、出力されます
これを簡単にするために、 と&y=3
としましょう&k=4
。
int y=1;
int k=2;
int *p1;
int *p2;
p1=&y; // p1=3
p2=&k; // p2=4
p1=p2; // p1=4
*p1=3; // p1=4 so k becomes 3
*p2=4; // p2=4 so k becomes 4
printf("%d",y); // we get 1 because y was never changed
あなたがするとき:
p1=p2;
基本的に、変数 k のアドレスを p2 から p1 にコピーしています。したがって、そのステップの後、両方のポインターが変数 k を指しているため、p1 または p2 のいずれかを逆参照すると、y ではなく変数 k の値が実際に変更されます。
あなたがするとき:
*p1 = 3;
変数 k に 3 を代入しています。次に、次のことを行います。
*p2 = 4;
変数 k に 4 を再度代入しています。そのため、y は変更されず、印刷すると 1 になります。
このステートメントはvariable を指すようにp1=p2;
設定します。したがって、次の両方の割り当て:p1
k
*p1=3;
*p2=4;
variable のみに影響するk
ため、y
1 のままです。
どうやって 4 にたどり着いたかを聞きたいのですが、p1 には y へのアドレス (つまりポインタ) が割り当てられますが、2 行後には k のアドレスに置き換えられます。したがって、p1 も p2 も y を指していないため、y は変化しません。