有兩個點在那裏你可以得到「胡言亂語」的價值觀但是其中只有一個是actualy其中垃圾被打印出來。
這個cout << &b << endl << &a << endl;
將通過使用操作符地址打印地址a
和b
。你看到的不是a
和b
的值,而是存儲在內存中的位置。這些是十六進制值,每次運行程序時它們可能都會更改。這是預期的行爲。
然後有這個構造:*(pb + 1)
這實際上是調用未定義的行爲。但爲什麼呢?首先pb
是一個指針,所以它存儲一個地址,更具體地說是存儲地址b
。您可以直接打印出pb
,這會得到與cout << &b
相同的結果,也可以使用取消引用運算符*
對其進行解引用。所以這cout << *pb
將打印的值不是地址pb
指向(10
btw)。現在你的聲明有什麼問題 - (pb + 1)
是不是增加值pb
是指向但地址保存在pb
。因此它不再指向b
的值,而是指向內存中的某個其他值。然後你解引用這個地址並讀取一些隨機值 - 這是你的「垃圾」值。
你可能想要的是增加pb
指向的值。所以cout << (*pb + 1)
將打印11
(注意括號放置在哪裏)。但cout << b
仍然會導致10
。如果你想真正改變的B您可以做到這一點的價值:
int b = 10;
int *pb = &b;
*pb += 1;
cout << b;
現在b
增加了一個不接觸b
本身。
*未定義的行爲* - '*(pb + 1);'訪問「越界」 – UnholySheep
這是未定義的行爲,一切都會發生。並且調用約定與此有什麼關係 –
因爲'pb'指向一個* single *'int'變量。當你執行'*(pb + 1)'時,它等於'pb [1]',它試圖使用'pb'作爲數組並且在數組中打印第二個*值。這超出了'pb'指向的範圍,並導致*未定義的行爲*。未定義的行爲會導致您的整個程序*不合格*並且無效。 –