C語言指針的概念詳解

 C語言指針的概念

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

    先聲明幾個指針放着做例子:

    例一:

    (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]

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

    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]

    在指針的算術運算中,指針所指向的類型有很大的作用。

    指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C越來越熟悉時,你會發現,把與指針攪和在一起的/"類型/"這個概念分成/"指針的類型/"和/"指針所指向的類型/"兩個概念,是精通指針的關鍵點之一。我看了不少書,發現有些寫得差的書中,就把指針的這兩個概念攪在一起了,所以看起書來前後矛盾,越看越糊塗。

    指針的值,或者叫指針所指向的內存區或地址

    指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32位程序裏,所有類型的指針的值都是一個32位整數,因爲32位程序裏內存地址全都是32位長。 指針所指向的內存區就是從指針的值所代表的那個內存地址開始,長度爲si zeof(指針所指向的類型)的一片內存區。以後,我們說一個指針的值是XX,就相當於說該指針指向了以XX爲首地址的一片內存區域;我們說一個指針指向了某塊內存區域,就相當於說該指針的值是這塊內存區域的首地址。

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

    以後,每遇到一個指針,都應該問問:這個指針的類型是什麼?指針指的類型是什麼?該指針指向了哪裏?

    C語言指針本身所佔據的內存區

    指針本身佔了多大的內存?你只要用函數sizeof(指針的類型)測一下就知道了。在32位平臺裏,指針本身佔據了4個字節的長度。

    指針本身佔據的內存這個概念在判斷一個指針表達式是否是左值時很有用。

 

本文來自:http://c.chinaitlab.com/c/basic/200901/773641.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章