2017-07-07 97 views
-1

我開始使用C++。我想了解不同的 輸出,同時玩這段代碼。循環和內存管理中的C++指針算術?

int main() 
{ 
    int i = 3; 
    int *ptr = &i; //stores address of the i 
    while(*(ptr)--) //the same as i-- 
    { 
     cout << *ptr << endl; 
    } 
} 

當我運行這段代碼據我所知,deferenced值PTR的 ,這是「我」,獲得1從中減去退出循環 當「我」等於0。但是當我使用while(* ptr--)而不是while(*(ptr) - )我得到一個隨機整數列表,最終會下降到0並且循環中斷。

據我瞭解,當我使用* ptr--我減去的&我(* PTR)每次循環的起始地址字節(一個爲int的大小)。但爲什麼程序最終終止?無論「我」的值是多少,程序都打印23個隨機數字,最後一個數字爲0,循環結束。由於程序內存不足,是否應該不會發生溢出錯誤?

但是,當我使用while(ptr--)程序會進入無限循環。 究竟發生了什麼?

非常感謝。

+0

只因爲一個循環很長並不意味着它是無限的。 – harold

+1

'* ptr - '和'*(ptr) - '完全一樣...... –

回答

2

(ptr)ptr相同,因此(ptr)--ptr--相同。

*ptr--i--不一樣!

您正在將operator--應用於指針的右側。後綴/後綴operator--有一個higher precedenceoperator*。所以,*ptr--*(ptr--)相同,而不是(*ptr)--,正如您所期待的那樣。

督察,ptr--最先被評估,返回當前指針的副本,然後遞減指針,然後你提領該複製指針檢索是以前是指向值在。

這就是爲什麼你看到垃圾 - 你正在將指針遞減到不屬於你的內存中。

要簡單地遞減int而不是指針,請改爲使用(*ptr)--。 IOW,取消引用指針,然後再遞減對準了值,例如:

int main() 
{ 
    int i = 3; 
    int *ptr = &i; //stores address of the i 
    while((*ptr)--) //the same as i-- 
    { 
     cout << *ptr << endl; 
    } 
} 

Live demo

括號和運算符優先級的事情!

+1

雖然可能已經過度完成,但是傳統上只需要處理來自先前開發的固件錯誤:使用括號使讀者和編譯器都清楚它是什麼,你打算做什麼。 – M4rc