深入理解資料型別 變數屬性 記憶體四區和指標

2021-07-26 17:10:06 字數 1229 閱讀 4614

資料型別可理解為建立變數的模具(模子);是固定記憶體大小的別名。

資料型別的作用:編譯器預算物件(變數)分配的記憶體空間大小。

既能讀又能寫的記憶體物件,稱為變數;若一旦初始化後不能修改的物件則稱為常量。

記憶體四區

棧區(stack):也叫臨時區,由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。

堆區(heap):一般由程式設計師分配釋放(動態記憶體申請與釋放),若程式設計師不釋放,程式結束時可能由作業系統**。

全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,該區域在程式結束後由作業系統釋放。

常量區:字串常量和其他常量的儲存位置,程式結束後由作業系統釋放

程式**區:存放函式體的二進位制**。

函式呼叫模型

函式1呼叫函式2,函式1稱為主調函式函式2稱為被呼叫函式。

main(主調函式)分配的記憶體(在堆區,棧區、全域性區)都可以在被呼叫函式裡使用。

c/c++可以在臨時區分配記憶體,但是用完後被系統清了。

如果在被呼叫函式裡面的臨時區(棧)分配記憶體,主呼叫函式是不能使用的。

要弄清是主調函式分配記憶體,還是被呼叫函式分配記憶體。

主調函式如何使用被呼叫函式分配的記憶體(技術關鍵點:指標做函式引數)。

heap、stack生長方向和記憶體存放方向是兩個不同概念。

指標1指標也是一種變數,占有記憶體空間,用來儲存記憶體位址

2在指標宣告時,*號表示所宣告的變數為指標

在指標使用時,*號表示 操作 指標所指向的記憶體空間中的值

*p相當於通過位址(p變數的值)找到一塊記憶體;然後操作記憶體

*p放在等號的左邊賦值(給記憶體賦值)

*p放在等號的右邊取值(從記憶體獲取值)

3指標變數和它指向的記憶體塊是兩個不同的概念

含義1  給p賦值p=0x1111; 只會改變指標變數值,不會改變所指的內容;p = p +1;

含義2  給*p賦值*p='a'; 不會改變指標變數的值,只會改變所指的記憶體塊的值

含義3  =左邊*p 表示 給記憶體賦值,=右邊*p 表示取值 含義不同

4指標是一種資料型別,是指它指向的記憶體空間的資料型別

含義1:指標步長(p++),根據所致記憶體空間的資料型別來確定

結論:指標的步長,根據所指記憶體空間型別來定。

C語言 深入理解資料型別

1.資料型別的本質 說到資料型別,許多學過c語言的程式設計師都不陌生,總的概括為四種型別,見下圖。提乙個問題,資料型別和記憶體有關係嗎?答案很明顯,有關係,這裡又要問了,有什麼關係呢?用一句話概括 資料型別是固定記憶體大小的別名,這就是資料型別的本質。站在c編譯器的角度去看這句話,很快就能明白。在程...

深入理解C語言 深入理解記憶體四區

當陣列做函式引數的時候,會退化為乙個指標 此時在函式內是得不到陣列大小的 因此,陣列做函式引數的時候需要傳遞陣列大小,也就是多傳遞乙個引數 void func int arr,int num 若存在以上函式,c c 編譯器在編譯的時候,會將陣列優化為乙個指標,指向陣列的首位址,因此無法通過sizeo...

深入理解變數 作用域 記憶體

變數這個概念其實說簡單也簡單,說複雜也複雜。特別是再記憶體的角度來理解 1 我們暫且不管堆記憶體和棧記憶體是什麼?我們把房間比作堆記憶體 房間號比作棧記憶體 2 定義 引用型別是堆記憶體中物件 基本型別是棧記憶體簡單資料段 3 這句話如何理解?4 var home 12 這代表房間的門牌號是12 v...