嵌入式學習資源——深入理解C語言指標的奧秘-1

千鋒教育官方發表於2019-08-13

指標的概念

  指標是一個特殊的變數,它裡面儲存的數值被解釋成為 裡的一個地址。 要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的 型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。

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

  例一:

   (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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章