1分鐘徹底理解C語言指標的概念

2021-07-24 00:07:22 字數 1461 閱讀 6923

計算機中所有的資料都必須放在記憶體中,不同型別的資料占用的位元組數不一樣,例如 int 占用4個位元組,char 占用1個位元組。為了正確地訪問這些資料,必須為每個位元組都編上號碼,就像門牌號、身份證號一樣,每個位元組的編號是唯一的,根據編號可以準確地找到某個位元組。

下圖是 4g 記憶體中每個位元組的編號(以十六進製制表示):

我們將記憶體中位元組的編號稱為

位址(address)

或指標(pointer)

。位址從 0 開始依次增加,對於 32 位環境,程式能夠使用的記憶體為 4gb,最小的位址為 0,最大的位址為 0xffffffff。

#include

intmain

()

執行結果:

0x28ff3c, 0x28ff10

%#x表示以十六進製制形式輸出,並附帶字首0x。a 是乙個變數,用來存放整數,需要在前面加&來獲得它的位址;str 本身就表示字串的首位址,不需要加&。c語言用變數來儲存資料,用函式來定義一段可以重複使用的**,它們最終都要放到記憶體中才能供 cpu 使用。

資料和**都以二進位制的形式儲存在記憶體中,計算機無法從格式上區分某塊記憶體到底儲存的是資料還是**。當程式被載入到記憶體後,作業系統會給不同的記憶體塊指定不同的許可權,擁有讀取和執行許可權的記憶體塊就是**,而擁有讀取和寫入許可權(也可能只有讀取許可權)的記憶體塊就是資料。

cpu 只能通過位址來取得記憶體中的**和資料,程式在執行過程中會告知 cpu 要執行的**以及要讀寫的資料的位址。如果程式不小心出錯,或者開發者有意為之,在 cpu 要寫入資料時給它乙個**區域的位址,就會發生記憶體訪問錯誤。這種記憶體訪問錯誤會被硬體和作業系統攔截,強制程式崩潰,程式設計師沒有挽救的機會。

cpu 訪問記憶體時需要的是位址,而不是變數名和函式名!變數名和函式名只是位址的一種助記符,當原始檔被編譯和鏈結成可執行程式後,它們都會被替換成位址。編譯和鏈結過程的一項重要任務就是找到這些名稱所對應的位址。

假設變數 a、b、c 在記憶體中的位址分別是 0x1000、0x2000、0x3000,那麼加法運算c = a + b;將會被轉換成類似下面的形式:

0x3000 = (0x1000) + (0x2000);

( )表示取值操作,整個表示式的意思是,取出位址 0x1000 和 0x2000 上的值,將它們相加,把相加的結果賦值給位址為 0x3000 的記憶體

變數名和函式名為我們提供了方便,讓我們在編寫**的過程中可以使用易於閱讀和理解的英文本串,不用直接面對二進位制位址,那場景簡直讓人崩潰。

需要注意的是,雖然變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是位址的助記符,但在編寫**的過程中,我們認為變數名表示的是資料本身,而函式名、字串名和陣列名表示的是**塊或資料塊的首位址。

1分鐘徹底理解C語言指標的概念

include int main 執行結果 0x28ff3c,0x28ff10 x表示以十六進製制形式輸出,並附帶字首0x。a 是乙個變數,用來存放整數,需要在前面加 來獲得它的位址 str 本身就表示字串的首位址,不需要加 c語言用變數來儲存資料,用函式來定義一段可以重複使用的 它們最終都要放到記...

《轉》C語言指標5分鐘教程

什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。在這份教程裡 引用 表示計算機記憶體位址。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。本...

1分鐘睡眠瑜伽 徹底告別失眠

快節奏的生活 忙碌的工作狀態,適合緊繃的神經很難停歇,而且平時又缺乏鍛鍊,缺少溝通和交流,積攢的心理壓力和煩惱,會慢慢把人累垮,漸漸的失眠多夢的人多了起來,對於傳統方法的數羊群或者睡前喝牛奶,也只是適合某些人群,今天瑜公尺之伽小編給大家送上福利,1分鐘,輕輕鬆鬆讓你安然入眠的睡眠瑜伽。近日有一位哈佛...