高分收藏!C語言初學者必看——記憶體與指標的指南

C語言是機器親和的,也就是說,在大多數情況下,它是要去遷就機器的。如果想學遷就人的語言,可以去學PHP,Python,Go,Java等。

高分收藏!C語言初學者必看——記憶體與指標的指南

工具與原理

高分收藏!C語言初學者必看——記憶體與指標的指南

指標與記憶體都是c語言中的要點與難點

記憶體是一維線性排列的

我們來寫一個簡單的程式:

高分收藏!C語言初學者必看——記憶體與指標的指南

我們在函式中聲明瞭3個變數,名字分別叫 a b c

我們列印一下這三個變數的地址,結果如下:

高分收藏!C語言初學者必看——記憶體與指標的指南

這三個地址都是0x開頭,是16進位制。

可以看出來,這三個數字逐漸減少,並且差值都為4。 也就是字長。

這當然不是偶然,c語言是故意設計成這個樣子的。

如下的圖可以直觀的表述:

高分收藏!C語言初學者必看——記憶體與指標的指南

指標的基本用法(初識指標)

main0。c:

高分收藏!C語言初學者必看——記憶體與指標的指南

上述程式碼無法實現a,b數值的交換。

高分收藏!C語言初學者必看——記憶體與指標的指南

改為指標型別實現程式碼如下:

main1。c:

高分收藏!C語言初學者必看——記憶體與指標的指南

為原來的變數值加上*, change函式改為傳入&a &b

3和5可以成功的交換。

高分收藏!C語言初學者必看——記憶體與指標的指南

int* a 與 int *a都是可以的,被稱為指標。& 取地址符。

我們要引入工具來分析

需要將

實參的地址

傳到子函式才能改變實參! 如change(&a,&b)

C語言中

int未初始化時,初值為隨機

int變數未初始化的預設初值,和變數的型別有關

區域性變數,在未初始化情況下,初值為隨機值。C規範對該初值並沒有做規定,具體實現由編譯器決定。如VC/VS等編譯器,會將初始值值為0xCCCCCCCC,而GCC等編譯器則是不可預知的隨機值。

靜態區域性變數,即帶static修飾的區域性變數。全域性變數和靜態全域性變數,即定義在函式外,不屬於任何一個函式的變數。這幾種預設初值為0。

常見問題解答:

◆ 為什麼列印地址時,我的列印結果跟上面不一樣?同一個程式碼每次執行,地址的列印結果也不一樣

因為每次程式碼執行過程中,變數的建立都要重新申請記憶體空間,每次申請的空間是『臨時』的,建立時申請空間,使用完自動釋放空間

感謝小夥伴的閱讀,如果有不錯的建議或意見,歡迎在評論區留言,喜歡的話,麻煩點個贊和關注哦~~~