c++變量在內存中的存儲區域

01 #include <iostream>
02
03 #include <string>
04 using namespace std;
05 int a = 0; // Initialization Area of Overall
06 char *p1; // Not Initialization Area of Overall
07
08 void main()
09 {
10 int b; // stack
11 char s[] = "abc"; // stack
12 char *p2; // stack
13 char *p3 = "123456"; // p3 in stack
14 static int c =0; // Initialization Area of Static Overall
15 p1 = new char[10];
16 p2 = new char[20];
17 strcpy(p1, "123456");
18 cout<<p1;
19 delete [] p1;
20 delete [] p2;
21 }

程序說明:
(1) 第5~6 行分別在函數體外部定義了兩個變量a 和p1,它們存儲在內存的靜態存儲區域。
(2) 第10~13 行定義的變量b、s、p2、p3 爲局部變量,存儲在內存的堆棧區。
(3) 第14 行定義的變量c 爲靜態局部變量,存儲在內存的靜態存儲區域。
(4) 第17 行使用strcpy 函數,將字符串“123456”複製給指針變量p1 指向的存儲單元。第18 行的輸出結果爲“123456”。


知識點:
(1) 當編譯一個C++程序時,計算機的內存被分成了4 個區域:程序代碼區、全局變量區、堆棧區和堆區。堆是自由的內存區域,可以通過new 和delete 把對象放在此區域,並可以在任何地方分配和釋放自由存儲區。
(2) C++中的變量可以分爲全局變量、靜態全局變量、靜態局部變量和局部變量。其中,全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區。
① 局部靜態變量。在局部變量之前加上關鍵字static,局部變量就被定義成爲一個局部靜態變量。
內存中的位置:靜態存儲區。
初始化:未經初始化的全局靜態變量會被程序自動初始化爲0(自動對象的值是任意的,除非被顯式初始化)。
作用域:作用域指變量的有效範圍,當定義它的函數或者語句塊結束時,作用域隨之結束。
注意:當static 用來修飾局部變量時,它就改變了局部變量的存儲位置,從原來的棧中存放改爲靜態存儲區。但是局部靜態變量在離開作用域之後,並沒有被銷燬,而是仍然駐留在內存中,直到程序結束,只不過不能再對它進行操作了。
② 全局靜態變量。在全局變量之前加上關鍵字static,全局變量就被定義成爲一個全局靜態變量。
內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)。
初始化:未經初始化的全局靜態變量會被程序自動初始化爲0(自動對象的值是任意的,除非被顯式初始化)。
作用域:全局靜態變量在聲明它的文件之外是不可見的,準確地講,是從定義處開始到文件結尾。
注意:當static 用來修飾全局變量時,它就改變了全局變量的作用域(在聲明它的文件之外是不可見的),但是沒有改變它的存放位置,還是在靜態存儲區。
③ 靜態函數。在函數的返回類型前加上關鍵字static,該函數就被定義成爲靜態函數。
函數的定義和聲明默認情況下是 extern 的,但靜態函數只在聲明它的文件中可見,不能被其他文件所用。
④ 靜態數據成員。
內存中的位置:靜態存儲區。
初始化和定義:
靜態數據成員定義時要分配空間,不能在類聲明中定義。
靜態數據成員在程序中只能提供一個定義。靜態數據成員的初始化不能在類的頭文件中。
訪問:
類實例名.靜態數據成員
類類型名::靜態數據成員
說明:
static 數據成員和普通數據成員一樣遵循public,protected,private 訪問規則。
對於非靜態數據成員,每個類實例都有自己的備份。靜態數據成員被當做類的全局對象,無論這個類的對象被定義了多少個,靜態數據成員在程序中也只有一個備份,由該類類型的所有對象共享訪問。
同全局對象相比,使用靜態數據成員有兩個優勢:
靜態數據成員沒有進入程序的全局名字空間,因此不存在與程序中其他全局名字衝突的可能性。
靜態數據成員可以實現信息隱藏。靜態成員可以是 private 成員,而全局對象不可以。
靜態數據成員的唯一性本質(獨立於類的任何對象而存在的唯一實例),使它能夠以獨特的方式被使用,這些方式對於非static數據成員來說是非法的。
⑤ 靜態成員函數。在類的成員函數返回值之前加上關鍵字static,它就被聲明爲一個靜態成員函數。靜態成員函數不能聲明爲const 或volatile,這與非靜態成員函數不同。
定義:出現在類體外的函數定義不能指定關鍵字static。
作用域:主要用於對靜態數據成員的操作。
靜態成員函數與類相聯繫,不與類的對象相聯繫。
靜態成員函數不能訪問非靜態數據成員,因爲非靜態數據成員屬於特定的類實例。
靜態成員函數沒有this指針,因此在靜態成員函數中隱式或顯式地引用這個指針都將導致編譯時刻錯誤。試圖訪問隱式引用this指針的非靜態數據成員也會導致編譯時刻錯誤。
訪問:可以用成員訪問操作符(.)和箭頭(->)爲一個類實例或指向類實例的指針調用靜態成
員函數,也可以用限定修飾符名直接訪問或調用靜態成員函數,而無需聲明類實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章