深入理解指標

2021-04-16 07:02:06 字數 2708 閱讀 7920

指標

是乙個特殊的變數

,它裡面儲存

的數值被解釋成為記憶體裡的乙個位址

。指標也是一種資料型別,並且也是有值的。

要搞清乙個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。

先宣告幾個指標放著做例子:

例一:

(1)int *ptr;

(2)char *ptr;

(3)int **ptr;

(4)int (*ptr)[3];

(5)int *(*ptr)[4];

1。 指標的型別。

從語法的角度看

,你只要把指標宣告語句裡的指標名字去掉

,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別: 

(1)int *ptr; //指標的型別是int *

(2)char *ptr; //指標的型別是char *

(3)int **ptr; //指標的型別是 int **

(4)int (*ptr)[3]; //指標的型別是 int(*)[3]

(5)int *(*ptr)[4]; //指標的型別是 int *(*)[4]

怎麼樣?找出指標的型別的方法是不是很簡單?

2。指標所指向的型別。

當你通過指標來訪問指標所指向的記憶體區時

,指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼來看待。

從語法上看,

你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符

* 去掉

, 剩下的就是指標所指向的型別。例如:

(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越來越熟悉時,你會發現,

把與指標攪和在一起的"型別

"這個概念分成

"指標的型別"和

"指標所指向的型別

"兩個概念

,是精通指標的關鍵點之一。我看了不少書,發現有些寫得差的書中,就把指標的這兩個概念攪在一起了,所以看起書來前後矛盾,越看越糊塗。

3。 指標的值,或者叫指標所指向的記憶體區或位址。

指標的值是指標本身儲存的數值

,這個值將被編譯器當作乙個位址

,而不是乙個一般的數值。在32位程式裡,所有型別的指標的值都是乙個32位整數,因為32位程式裡記憶體位址全都是32位長。所以不管任何型別的指標,它佔據的儲存空間都是

4個位元組。

指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始

,長度為

sizeof(指標所指向的型別

)的一片記憶體區。以後,我們說乙個指標的值是xx,就相當於說該指標指向了以xx為首位址的一片記憶體區域;我們說乙個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首位址。

指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在例一中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。

以後,每遇到乙個指標,都應該問問:這個指標的型別是什麼?指標指向的型別是什麼?該指標指向了**?

4。 指標本身所佔據的記憶體區。

指標本身佔了多大的記憶體?你只要用函式sizeof(指標的型別)測一下就知道了。

在32位平台裡

,指標本身佔據了

4個位元組的長度。 指標本身佔據的記憶體這個概念在判斷乙個指標表示式是否是左值時很有用。

補充:何為

32位機器和字長?

32位系統指機內 資料長度,指令長度,位址長度是二進位制32位。

64位系統指機內 資料長度,指令長度,位址長度是二進位制64位。

64位系統速度快。32位系統系統要尋高於32位的位址就要用到複雜一點的運算,用兩個32位單元組合成(好幾步才能到位)。64位系統直接定址(一步到位)。

32位的暫存器和指令集不能及時進行相應的處理運算。32位處理器一次只能處理32位,也就是4個位元組的資料;而64位處理器一次就能處理64位,即8個位元組的資料。

字長:電腦技術中對

cpu在單位時間內

(同一時間

)能一次處理的二進位制數的位數叫字長。所以能處理字長為8位資料的cpu通常就叫8位的cpu。同理

32位的cpu

就能在單位時間內處理字長為

32位的二進位制資料。位元組和字長的區別:由於常用的英文本元用8位二進位制就可以表示,所以通常就將8位稱為乙個位元組。

字長的長度是不固定的,對於不同的

cpu、字長的長度也不一樣。8位的cpu一次只能處理乙個位元組,而32位的cpu一次就能處理4個位元組,同理字長為64位的cpu一次可以處理8個位元組

深入理解指標

指標 是乙個特殊的變數 它裡面儲存 的數值被解釋成為記憶體裡的乙個位址 指標也是一種資料型別,並且也是有值的。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 ...

深入理解指標

指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標做例子 例一 1 in ptr 2 char ptr...

深入理解指標

學習c語言這麼久,使用指標時還是有這樣或者那樣的問題,且每次都有新的問題出現,只能感慨其博大精深。但指標作為c c 的精華,我們也只能迎難而上。0.何為指標?int p 如上述例子,我們可以這樣理解 我們定義了乙個指標變數p,它指向的資料的型別為int型。每當定義這樣乙個int 型的指標變數,系統 ...