資料型別可理解為建立變數的模具(模子);是固定記憶體大小的別名。
資料型別的作用:編譯器預算物件(變數)分配的記憶體空間大小。
既能讀又能寫的記憶體物件,稱為變數;若一旦初始化後不能修改的物件則稱為常量。
記憶體四區
棧區(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...