指標詳解系列1 指標的定義

2021-10-05 04:37:35 字數 1776 閱讀 1366

指標的描述(以下的所有地方都基於c89標準):

指標與陣列,結構,聯合等一樣也是一種資料物件,其值是另外乙個物件的位址(這是重點,指標變數裡面儲存的內容是另外乙個物件的位址)。

「指標」得名於這樣的事實:其內容「指向」另外乙個物件。指標可以指向任何型別(完整型別的或者不完整型別)的物件。乙個指標還可以指向其他指標(也就是指向指標的指標),可以實現「多重間接定址」。更為重要的是指標還可以指向乙個函式(入口位址)。當然,乙個指標也可以什麼地方也不指向(空指標)。

乙個指標並不能指向各種型別的物件(在一定的條件下,可以進行強制型別轉換),即並不是各種物件(變數)的位址都可以儲存到任一指標物件(變數)中,和其他物件一樣,每乙個指標物件也有乙個確定的型別。說起來好像有點拗口,例如:具有指向字元的指標型別的物件不能用於儲存整數物件的位址(即不能把整數物件的位址賦值給指向字元的指標變數,強制型別轉換除外),反之亦然。

指標型別是由指向物件的型別確定的,一種指標型別的所有物件(變數)所指向的物件的型別必須是相同的。指標變數在使用之前必須進行說明,其說明的一般形式是:

《指向型別》 * 《變數識別符號》

例如,變數說明:

int *intptr; //乙個指向int型別的指標變數intptr

char *charptr; //乙個指向char型別的指標變數charptr

char ** ptrtochar;//乙個指向char *型別的指標變數ptrtochar

指標變數的長度問題:乙個指標變數的取值範圍(長度)不是固定的,但是其範圍總是應該可以覆蓋機器可用記憶體的位址(這是決定指標變數長度的重點)。比如在一些小ram的4位機上,可能指標只有11bits,在x86上32bits(也就是早期pc最大記憶體空間4gb=0xffffffff的緣故),在64位機上指標就變成了64bits

每一種型別的指標物件都有乙個特殊的值null。在stddef.h中空指標null定義如下

#define null 0 /* null pointer constant. */

空指標表示指標不指向任何位置。該值是有別於指向具體物件或者函式的指標的特殊值。

指標的指標變數:是指向另乙個指標的位址的一種變數型別。

先看看最基本的,比較單一的,也是常用的指標定義和其在記憶體的儲存內容。

這是我的一段基本測試**,用來說明指標的最基本原理和用法,雖然只是演示了整數型別的使用,對其他型別具有相同的原理,請舉一反三,開發環境基於keil mdk 5.26。

int testpointer

(void)

指標的基本定義和使用參考**裡面的注釋理解。

我們看看輸出的結果,對照**就比較容易理解。

前面1-5行分別輸出了幾個變數在記憶體中的位址,可以看到,每乙個變數占用四個位元組,也就是32位長度

第6行輸出了int型別變數result的值。

第7行顯示了乙個指標變數的內容,也就是變數result的位址。和前面第1行列印的一致。

第8行顯示了通過指標的指標的變數去訪問result的方式。

第9行展示了乙個不常用的,詭異的,匪夷所思的,但是c語言允許而且編譯器支援的型別:指標的指標的指標,我們獲得了正確的結果。你如果願意還可以一直定義下去,比如int **** pppint;一般我們不使用這種晦澀的定義方式,除了耍酷和證明編譯器支援以外,平時不要去使用這種難以理解的方式。

51指標定義

c51指標型別和儲存區的關係詳解 轉貼 一 儲存型別與儲存區關係 data 可定址片內ram bdata 可位定址的片內ram idata 可定址片內ram,允許訪問全部內部ram pdata 分頁定址片外ram movx r0 256 byte 頁 xdata 可定址片外ram 64k 位址範圍 ...

C primer plus系列7 指標

1 p是指標,是位址 int p 2 程式設計習慣,空格位置 int p 這裡強調 p是乙個int型別的變數,c程式設計師經常使用這種形式 int p 這裡強調int 是乙個型別,用來定義指向int的指標 int p1,p2 這樣建立的是乙個指標,乙個int型變數 因為乙個指標需要乙個 3 c語言中...

4 指標運算 指標函式詳解

1.指標 資料型別 儲存位址的資料型別 2.指標變數 儲存位址的變數 4.指標的定義 型別名 變數名 型別名 變數名 表示指標變數 指標的計算 型別名 定義 先 後變數名,後型別名。int 3 1 p 2 5.指標所佔位元組 資料型別 在32位系統中,佔4個位元組 6.指標變數型別 去掉變數名 in...