嵌入式學習資源——深入理解C語言指標的奧秘-1
指標的概念
指標是一個特殊的變數,它裡面儲存的數值被解釋成為 裡的一個地址。 要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的 型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。
先宣告幾個指標放著做例子:
例一:
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];
如果看不懂後幾個例子的話,請參閱我前段時間貼出的文章 << 如何理解 c 和 c ++ 的複雜型別宣告 >> 。
指標的型別
從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別:
(1)int*ptr;// 指標的型別是 int*
(2)char*ptr;// 指標的型別是 char*
(3)int**ptr;// 指標的型別是 int**
(4)int(*ptr)[3];// 指標的型別是 int(*)[3]
(5)int*(*ptr)[4];// 指標的型別是 int*(*)[4]
怎麼樣?找出指標的型別的方法是不是很簡單?
指標所指向的型別
當你透過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區裡的內容當做什麼來看待。
從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符 * 去掉,剩下的就是指標所指向的型別。例如:
(1)int*ptr;// 指標所指向的型別是 int
(2)char*ptr;// 指標所指向的的型別是 char
(3)int**ptr;// 指標所指向的的型別是 int*
(4)int(*ptr)[3];// 指標所指向的的型別是 int()[3]
(5)int*(*ptr)[4];// 指標所指向的的型別是 int*()[4]
在指標的算術運算中,指標所指向的型別有很大的作用。
指標的型別
(
即指標本身的型別
)
和指標所指向的型別是兩個概念。當你對
C
越來越熟悉時,你會發現,把與指標攪和在一起的
"
型別
"
這個概念分成
"
指標的型別
"
和
"
指標所指向的型別
"
兩個概念,是精通指標的關鍵點之一。我看了不少書,發現有些寫得差的書中,就把指標的這兩個概念攪在一起了,所以看起書來前後矛盾,越看越糊塗。
指標的值,或者叫指標所指向的記憶體區或地址
指標的值是指標本身儲存的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在 32 位程式裡,所有型別的指標的值都是一個 32 位整數,因為 32 位程式裡記憶體地址全都是 32 位長。 指標所指向的記憶體區就是從指標的值所代表的那個記憶體地址開始,長度為 si zeof( 指標所指向的型別 ) 的一片記憶體區。以後,我們說一個指標的值是 XX ,就相當於說該指標指向了以 XX 為首地址的一片記憶體區域;我們說一個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首地址。
指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在例一中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。
以後,每遇到一個指標,都應該問問:這個指標的型別是什麼?指標指的型別是什麼?該指標指向了哪裡?
指標本身所佔據的記憶體區
指標本身佔了多大的記憶體?你只要用函式 sizeof( 指標的型別 ) 測一下就知道了。在 32 位平臺裡,指標本身佔據了 4 個位元組的長度。
指標本身佔據的記憶體這個概念在判斷一個指標表示式是否是左值時很有用。
指標的算術運算
指標可以加上或減去一個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的。例如:
例二:
1 、 chara[20];
2 、 int*ptr=a;
...
...
3 、 ptr++;
在上例中,指標 ptr 的型別是 int*, 它指向的型別是 int ,它被初始化為指向整形變數 a 。接下來的第 3 句中,指標 ptr 被加了 1 ,編譯器是這樣處理的:它把指標 ptr 的值加上了 sizeof(int) ,在 32 位程式中,是被加上了 4 。由於地址是用位元組做單位的,故 ptr 所指向的地址由原來的變數 a 的地址向高地址方向增加了 4 個位元組。
由於 char 型別的長度是一個位元組,所以,原來 ptr 是指向陣列 a 的第 號單元開始的四個位元組,此時指向了陣列 a 中從第 4 號單元開始的四個位元組。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2653536/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 嵌入式學習資源——深入理解C語言指標的奧秘-2C語言指標
- C語言指標學習C語言指標
- C語言學習之:指標與字串C語言指標字串
- C語言基礎-1、指標C語言指標
- go 語言指標學習Go指標
- C語言學習筆記之指標的運算C語言筆記指標
- C語言指標C語言指標
- C語言深入學習二C語言
- C語言學習筆記:結構體與指標C語言筆記結構體指標
- HQYJ嵌入式學習筆記——C語言複習day1筆記C語言
- C指標-這該死的嵌入式學習生涯指標
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- 嵌入式C語言學習筆記2C語言筆記
- C語言 函式指標C語言函式指標
- C語言指標筆記C語言指標筆記
- C語言基礎-指標C語言指標
- c語言指標彙總C語言指標
- C語言指標用法大全C語言指標
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 嵌入式學習資源——突破C++的虛擬指標-C++程式的緩衝區溢位攻擊C++指標
- C語言知識彙總 | 56-C語言NULL空指標以及void指標C語言Null指標
- 標準C語言1C語言
- c語言實現this指標效果C語言指標
- 搞清楚C語言指標C語言指標
- C語言指標基本知識C語言指標
- C語言指標詳解(一)C語言指標
- C語言指標詳解(二)C語言指標
- C語言 指標與陣列C語言指標陣列
- 資訊學奧賽--C語言筆記(一)C語言筆記
- C語言關於指標,gets()和gets_s()函式的理解C語言指標函式
- C語言指標總結大學霸IT達人C語言指標
- c語言函式指標的定義C語言函式指標
- C語言學習方法,怎麼學習C語言?C語言
- 徹底學會 Go 指標 -- 就要學習 Go 語言Go指標
- C語言與嵌入式C語言的區別C語言
- 1.C語言有關的小學習C語言
- C語言指標常見問題C語言指標