0

私は一般的にポインタのロジックのアイデアを思いつきましたが、基礎となるコードの一部に関連する不明確な点があります。

#include <iostream>
using namespace std;

int main ()
{
int first = 50, 
second = 150;
int * p1, * p2;

p1 = &first;         //p1 is assigned to the address of first
p2 = &second;        //p2 is assigned to the address of second
*p1 = 100;           //first's value is changed as 100 by assigning p1's value to 100
*p2 = *p1;           //now p2's value should be 100 
p1 = p2;             //I think we want to change p1's adress as p2
*p1 = 200;           //I expect that the new value of p1 should be 200

cout << first << second;

return 0;
}

プログラムはfirst=100とsecond=200を出力しますが、上でコメントしたように、p1の値は200に変更されると思います。しかし、それでも100のままです。そのポイントは何ですか。

4

4 に答える 4

7

ポインタ値とポインタが指す値を混同しているようです。

*p1 = 200;           //I expect that the new value of p1 should be 200

p1はポインタであるため、その値は実際にはメモリの場所、つまりの場所ですfirst。(0xDEADBEAFのようなもの)。この行の後:

p1 = p2;

p1のメモリ位置を指しているままにsecondなっているので、

*p1 = 200;

実際にはに設定secondされて200います。

于 2011-11-07T22:40:00.030 に答える
3

コード内でポインタとその値がどのように変化するか

于 2011-11-08T00:21:00.210 に答える
1

p1 = p2ポインタがp1を指すintをp2指すようにします。ここp1でを指しsecondます。*p1したがって、その命令の後、の値に影響を与えるすべての変更*p2、したがってsecond

于 2011-11-07T22:40:56.497 に答える
0

p1に格納されているアドレスの場所に100の値を割り当てています。これは問題ありません。次に、この値をp2に移動します。しかし次に、再びp1 = p2を割り当てます。これにより、p2に格納されているアドレスがp1に移動され、問題が発生します。この行にコメントを付けると、コードは期待どおりに機能します。

于 2015-07-20T23:52:07.933 に答える