1 指標的那些事

2022-07-10 04:39:12 字數 2651 閱讀 6018

學逆向最重要的基礎就是c/c++,而學c其實就是學指標,指標的重要性不言而喻,而阻擋大家的指標,其實並沒有那麼難理解,我們一起看看吧!

學習指標前必須了解記憶體是個什麼樣子的,不然無法理解指標的概念

|               a               |  0x0

|               b               |  0x4

|               c               |  0x8

|               d               |  0xc

|               e               |  0xf

這就是乙個基本的記憶體模型,每一行代表乙個記憶體,格內代表記憶體,格內內容代表存入的值,格後方標號代表記憶體位址

我們每次在申請變數時,如 int x=0x15;  其實是在記憶體中申請了一段空間,int代表申請四位元組,x是變數名,0x15是值。

對應上圖中第一行,在格內放入變數名為x、值0x15的乙個四位元組變數。

這裡知識點出現了:在32位系統下,乙個記憶體位址就是四個位元組,所以我們申請乙個int,相當於佔了一整行,也就是乙個記憶體空間,而記憶體空間的位址為編號0x0。

它在記憶體里長這樣:

|      00    00   00    15         |  0x0        (其實此處涉及大小端序的問題,但是為了方便理解我們先以大端序為例)

理解了這個,我們再來想一下,如果我申請的是 char x=0x15; 會怎麼樣呢?

沒錯,因為char只佔乙個位元組,第一行沒被佔滿,其實記憶體是這樣的:

|      15    00   00    00         |  0x0  

本例後面這三個位址是沒有被分配的,而上例中4個位元組均被分配了。

好的,到這大家其實已經把指標學明白了。嗯?你不都沒提指標嗎?

對,指標就是存放標號的變數而已,值就是格仔右邊的0x0。至於指標有型別只不過是它每移動一次是幾個位元組而已,這個放到下面講。

此處你只需要記住,指標是乙個變數,它的值是位址的值就好了。

在c語言中陣列其實與指標有著千絲萬縷的聯絡。

首先我們來看一段**:

首先這裡有乙個變數a和乙個陣列b,其中pa是a的指標(&符號是取位址的意思),pb是b的指標。

到這裡細心的小夥伴應該發現了,你不是說pb是b的指標嗎,為什麼不加取位址符號?這裡就是我們學習指標要過的第乙個坎:陣列名其實就是指標!

我們先不看b和pb,大家都知道pa其實是a的位址,而通過指標訪問a的寫法為*pa,那pa+1呢?沒錯,是a的位址加上4個位元組,同理訪問其值的寫法為*(pa+1)。

那有了這個基礎,我們先來看一下b的訪問,如果你想取陣列的第乙個值,你得寫b[0],

第二個b[1]。如果用pb訪問呢?分別為*pb,*(pb+1)。嗯?到這裡是不是發現了什麼?沒錯!就是你想的那樣。陣列的訪問其實是指標加偏移的形式訪問的,所以說陣列名其實就是指標!

我們打出b和pb:

到這裡就完了嗎?怎麼可能,到這完了肯定有大佬噴我了。那我們忽略了**呢?就是&b和&b+1到底指向**,我們打出來看看:

聰明的小夥伴已經明白了吧,&b時指向的還是陣列b的第乙個資料的首位址,而整個陣列b指標的加1,要加上整個陣列大小進行位址偏移(本例中是5個位址偏移)。

最後我們再從彙編層面看看陣列訪問時的行為:

沒錯吧!其實底層的行為就是基址加偏移訪問的。

到這裡,指標基本就學完了,我們來解決下遺留問題:

一、指標的型別

從上面例子中不難看出,我們一直使用的是int*型別的指標,而它每次加1就會移動四個位元組。如果我們換成char*型別的呢?

沒錯那每次就移動乙個位元組,當然這樣的話就會遇到一些問題,但是這些問題是可以**的,

當然會涉及到大小端序,在此處就不討論了,大家感興趣自己去試試就好了

二、指標陣列和陣列指標

這個其實很多人分不清,但是沒必要。這只是個文字遊戲而已,我區分他們的方法很簡單,就是中間加個的。

"的"字後面出現的是關鍵:指標的陣列,表名它是陣列,而每個陣列的內容是由指標構成的。

陣列的指標,表名它是指標,是指向陣列的指標,上面已經提到了,就是那個加1時會移動整個陣列長度的指標。

三、函式的指標

函式指標也沒啥新鮮的,依舊是指標。只是定義時比較特別需要typedef。它的關鍵在於可以直接通過指標加引數的形式呼叫。

它可以傳參呼叫函式,這是重點也是難點,這樣一來它的應用就比較靈活了,因為你可以通過乙個指標呼叫不同函式。

這也是高階程式設計中經常使用的方式,如果有興趣可以自行研究。

上課心得1 指標

指標 指標 乙個指標是乙個位址,是乙個常量。而乙個指標變數卻可以被賦予不同的指標值,是變數。但常把指標變數簡稱為指標。為了避免混淆,我們約定 指標 是指位址,是常量,指標變數 是指取值為位址的變數。定義取值為位址的變數。定義指標的目的是為了通過指標去訪問記憶體單元。對於指標變數的定義包括三個內容 1...

C 面試 (1) 指標

指標是c 中一類頗具特色的資料型別,允許直接操作記憶體位址,實現記憶體的動態分配。指標問題通常包括指標常量,常量指標,陣列指標,指標陣列,函式指標,指標傳值等。指標和引用的區別 非空區別。在任何情況下都不能使用指向空值的引用。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向...

C 基礎(1) 指標

三.指標使用 四.函式和指標 五.const 和指標 指標是另外一種型別的復合型別,復合型別是指基於其它型別定義的型別 意思是說指標是指向什麼型別,那麼指標本身就是什麼型別 指標其實就是程式資料在記憶體中的位址,而指標變數是用來儲存這些位址的變數 記憶體是乙個很大的,線性的位元組陣列。每乙個位元組都...