指標知識點及易錯點總結

2021-08-25 22:26:01 字數 2007 閱讀 4927

(本文示例**環境為 vs2017下純c** ,c++因為型別檢測增強,**會直接標紅,需要強轉才能執行)

1.指標

1.1指標簡介

指標是一種資料型別,自身占用記憶體空間(win32平台,所有指標占用4位元組記憶體空間),指標儲存的是記憶體位址的編號。

指標變數指向誰,就把誰的位址賦值給指標變數。指標通過 * 解引用,操作的是指標變數指向的記憶體空間,可以實現取值間接賦值

1.2指標的宣告和使用

在指標宣告時,* 號表示所宣告的變數為指標。

在指標使用時,* 號表示操作指標所指向的記憶體空間。

易錯點:* 只能用來操作指標。

用一級指標接收二級指標的值,並不能實現二次解引用。

用二級指標接收一級指標的值,同樣不能實現二次解引用。

**示例1:**一級指標接收並操作二級指標的值

int main()
除錯檢視記憶體截圖如下:

注:上圖中十六進製制數 0x007df982 等於 十進位制數 8255784

**示例2:**一級指標接收並操作二級指標的值

int main()
除錯檢視記憶體截圖如下:

注:上圖中十六進製制數 0x0000000a 等於 十進位制數 10

**總結:**初學指標的同學大多容易突發奇想,具體表現為把自己搞懵圈,然後很容易把哪些思想中規中矩而且的同學也帶進坑里。

有想法就去嘗試,實踐是檢驗真理的唯一標準,往往是一些非常規的新奇想法更容易促進對知識點的理解。

1.3野指標,萬能指標,空指標

1.3.1野指標

野指標指標操縱的記憶體空間必須是我們已經向作業系統申請的合法空間,如果指標指向了我們不具備操作許可權的區域,即為野指標。出現野指標不會直接引發錯誤,操作野指標指向的記憶體區域才會出問題,並不一定是程式直接掛掉。

野指標出現的四種情況:

指標變數未初始化

指標釋放後未置空

指標操作超越變數作用域

int * test() 

int main()

總結:避免野指標的最好方法就是初始化置空,和釋放後置空。

1.3.2 空指標

空指標並不是null,而是把指向null的指標稱為空指標,這個操作稱為將指標置空。其實置空就是用null覆蓋了原先指標儲存的位址空間,嚴格意義上講,置空後的指標仍然是乙個野指標,同樣不能對其進行操作。

野指標可能引發很多奇怪的問題,我們一定要盡量避免操作野指標,但是如果**量級很大,我們操作乙個 「陌生」 指標之前可以知道其是否是野指標嗎?

所以說指標使用過後(野指標)置空即為判斷乙個指標是否合法的前置條件,置空後我們可以使用if語句測試該指標是否為null,有效排除操作野指針對我們程式的影響。

我們寫**時,要注意指標置空的妙用,養成良好的變成習慣。

1.3.3萬能指標

void *指標即為萬能指標,可以指向任意變數的記憶體空間,可以接收任意型別變數的值,這樣做的意義大家會慢慢發覺。但是現階段我們需要注意,不能對萬能指標解引用。

int main()
1.14指標常量在編輯程式時,指標作為函式引數,如果不想修改指標對應記憶體空間的值,需要使用const修飾指標資料型別

int main()

指標易錯知識點小結

一 c語言指標知識點小結 1 初始化指標的時候會自動分配八個位元組 任何型別的指標 1 定義指標變數的時候,如int p 僅僅是代表該變數是指標變數,可以認為 int p 2 p a 是正確的。int p a 正確。表示把a的位址賦給p,是的指標p指向a.p a 這條語句是錯誤的,它表示的是把a的位...

C易錯知識點

參考酷客網,對其進行了簡單整理 1 下面的程式並不見得會輸出 hello std out 你知道為什麼嗎?include include intmain return 0 參 stdout 和stderr 是不是同裝置描述符。stdout 是塊裝置,stderr 則不是。對於塊裝置,只有當下面幾種情...

Java 易錯知識點

1 以下程式執行的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 classx classy publicclasszextendsx publicstaticvoidmain string args zyxx zyxy yxyz xyz...