c++的for迴圈中變數地址問題

來源:互聯網
上載者:User

標籤:固定   cpp   變數   使用   為什麼   定義   一個隊列   二次   作用   

for f(int i; i<10; i++){    int c=0;    cout<<c<<&c<<endl;}

看這個簡單的代碼,新玩家容易有這樣的認識:既然for迴圈中的代碼被迴圈執行,那麼為什麼變數c沒有被重定義呢。

這個問題看過任何一本c++教材頭兩章的都能解答,是因為範圍的存在。變數c在每一次迴圈結束後儲存空間會被釋放掉,而在下一次迴圈開始的時候再次定義。

那麼,第二次迴圈中的變數的地址和第一次迴圈變數的地址是在同一個儲存位置嗎?

答案是肯定的。並且如果中間又聲明了其他的變數,比如在第三次迴圈是聲明了另一個變數,最後的執行結果依舊是這十次迴圈c的地址都沒有改變。

這可能是和編譯器有關,通過編譯器的最佳化使得範圍內的變數的位置固定了。因此如果涉及到對迴圈內變數的地址的儲存工作,如將變數的地址存在一個隊列或者容器中,最好使用new或者malloc,否則容器存的多個變數地址很可能都是指向同一個位置,從而導致程式出現奇怪的結果。如下面這段代碼:

vector<int*> res,res2;for f(int i; i<10; i++){    int c=i;    int* d=new int(i);    res.push_back(&c);    res2.push_back(d);}

  最終的結果res中c的地址都是一樣的,c中儲存的數也都是最後一次迴圈中c的結果。而res2中d的地址則不相同,儲存的i值是從0到9.

c++的for迴圈中變數地址問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.