C C 中變數的可見性與生命期區別的本質原因

2021-07-17 04:36:25 字數 943 閱讀 2558

可見性與生命期

可見性又可稱為:作用域,它是「棧」這種儲存方式的表現形式。不管是全域性的可見性(全域性作用域)、還是區域性可見性(區域性作用域),從乙個物件(或稱為變數、例項)的入棧(開始可見)到其出棧(變成不可見),是該物件的整個的作用域。

可見性與生命期是兩個分立的概念,但似乎又存在這某種聯絡。比如:如果乙個物件變得不可見了,那麼似乎該物件的生命期也就結束了。而「堆」、「全域性靜態區」、「常量區」這三種不同於「棧」的儲存方式卻又告訴我們,當物件不可見的時候,其生命期可能並沒有結束。。。。那麼到底是什麼造成了這兩種概念上的差異?而使得我們大多數初學c/c++語言的人的迷惑不解的呢?

答案就是:指標!!!

原因如下:

當我在上面的論述中提到「物件」(或稱變數、例項)的時候,其實,我並沒有將「物件本身」和「物件所處的記憶體的位址」(即指標的值)加以區分。對於基本資料型別,往往很少用到這種區分,因為基本型別的變數往往都直接存放在「棧」上(當然也可以通過動態記憶體分配將其放在堆中,如:int* p = new int(1);),所以不需要「間接定址」(根據指標找到實際對應的物件)

而如果我們都是採用動態記憶體分配的方式,即用指標來表示其所對應的物件時(如:object* o = new object(); ),這種可見性和生命期 的分立就體現出來了:即指標對應的是可見性,而指標所指向的物件(也即指標所指向的記憶體)對應的是生命期。因為指標是在棧上分配儲存的(指標也是乙個變數),所以其可見性如前面所述,是棧這種儲存方式的表現形式。當指標出棧時,它本身不可見了,從而也間接的導致了它所指向的物件變得不可見,但這時這個物件本身的生命期並沒有結束,因為物件本身並不是在棧上分配空間的。

這個時候,如果在其他函式或**中不再有任何指標儲存該物件的位址,那麼這個物件就將不可以繼續被訪問,即該物件已經不可見了,但是其生命期並為結束,所以對於的記憶體並未被收回。例 : 函式內的靜態變數,堆分配的變數 都可以屬於這種情況

深入C 可見性與生命期的區別詳解

變數的可見性 即作用域 和生命期既有區別,又有聯絡。乙個變數在程式的某處沒有可見性,www.cppcns.com但生命期任www.cppcns.com然可以存在,比如區域性靜態變數的可見性在它所在的函式裡面,在函式外部不可訪問,但是它的生命期確是整個程式的執行期間 而乙個變數生命期結束,它也就沒有了...

變數的作用域與可見性

1.基本概念 變數有資料型別 char unsigned char short unsigned short int unsigned int long unsigned long float double 定義變數 int a 100 自動分配4位元組的記憶體空間,其中儲存100 2.從作用域與可...

變數的生存期與可見性例題

接下來舉一具體例子予以說明。other函式中a,b為靜態區域性變數,具有全域性壽命,區域性的可見性。i為全域性變數。靜態變數不初始化預設值為0。主函式中a為靜態區域性變數,b.c為動態變數。第一次主函式輸出 i 1,a 0,b 10,c 0 第一次other函式輸出 全域性變數i 32,a 2,b為...