C語言指標是什麼

2021-10-03 06:06:32 字數 1392 閱讀 3037

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

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

記憶體中位元組的編號稱為位址(address)或指標(pointer)。位址從 0 開始依次增加,對於 32 位環境,程式能夠使用的記憶體為 4gb,最小的位址為 0,最大的位址為 0xffffffff。

#include

intmain()

執行結果:

0x28ff3c

,0x28ff10

%#x表示以十六進製制形式輸出,並附帶字首0x。a 是乙個變數,用來存放整數,需要在前面加&來獲得它的位址;str 本身就表示字串的首位址,不需要加&。

c語言中有乙個控制符%p,專門用來以十六進製制形式輸出位址,不過 %p 的輸出格式並不統一,有的編譯器帶0x字首,有的不帶。

c語言用變數來儲存資料,用函式來定義一段可以重複使用的**,它們最終都要放到記憶體中才能供 cpu 使用。

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

cpu 只能通過位址來取得記憶體中的**和資料,程式在執行過程中會告知 cpu 要執行的**以及要讀寫的資料的位址。如果程式不小心出錯,或者開發者有意為之,在 cpu 要寫入資料時給它乙個**區域的位址,就會發生記憶體訪問錯誤。

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

0x3000=(

0x1000)+

(0x2000

);

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

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

如果感覺不錯的話請點贊喲!!!

C語言中「野指標」 「懸空指標」是什麼?

1 野指標 wild pointer 2 懸空指標 dangling pointer 野指標 wild pointer 是沒有被初始化過的指標,所以不確定指標具體指向。例如以下示例 void p 此時 p 是 野指標 因為 野指標 可能指向任意記憶體段,因此它可能會損壞正常的資料,也有可能引發其他未...

C 中指標是什麼?

以下問題都是我在學習c 的指標時比較淺顯的一些個人的理解 1 什麼是指標?回答這個問題之前,先想想什麼是記憶體位址?我們在程式中定義乙個變數,系統會自動分配乙個記憶體位址,在c 中位址可以通過 變數名 這種格式來獲取。指標其實也是一種型別,像int char一樣,只不過指標變數存放的是記憶體位址 2...

C語言指標學習 一 指標是什麼

僅供自己學習使用,謝謝!指標的定義 位址 記憶體單元的編號 從0開始的非付整數 在32位機器上,記憶體最大為4g 2 32個位元組 指標 指標就是位址,位址就是指標 指標變數就是存放記憶體單元編號的變數,或者說指標變數就是存放位址的變數 指標和指標變數是兩個不同的概念 需要注意的是,我們平時在敘述的...