C語言指標的概念

2021-07-31 06:59:21 字數 1460 閱讀 3209

計算機中所有的資料都必須放在記憶體中,不同型別的資料占用的位元組數不一樣,例如 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 的記憶體

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

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

C語言中的指標概念

一般把資料都放在儲存器中,儲存器中乙個位元組稱為乙個記憶體單元 不同資料型別所占用的記憶體單元數不等,如整型量佔2個單元,字元量佔1個單元,每個記憶體單元都有編號.這個編號也叫位址.就是我們所說的指標.記憶體單元的指標和記憶體單元的內容是兩個不同的概念.對於乙個記憶體單元來說,單元的位址即為指標,其...

C語言指標的基本概念

指標是一種型別,被稱為 指標型別 指標型別描述的是乙個位址,這個位址指向記憶體中另外乙個物件的位置。簡單地說,指標表示的是它所指向物件的位址。1 比較point,point,point三者的區別 對於int point point 是指標變數的目標變數,即指標指向的那個變數,其內容是資料。2 指標與...

C 語言 指標的概念與理解

我們知道,大多數現代計算機都將記憶體分割為位元組 byte 每個位元組儲存 8 位資訊。每個位元組都有乙個唯一的位址 可以把位址看作乙個數 我們可以把它看做乙個唯一的識別符號。這個位址是為了用來和記憶體的其他位元組相區別。這就是指標的出處了,我們雖然可以用數表示位址,為什麼不直接用普通整型變數來儲存...