關於C指針用法的體會和感受

      提到C語言的靈活性,很容易就想到了指針,而指針也是讓很多人迷惑不解的地方。指針的定義是一種用地址來訪問計算機內存中存儲的數值的方式,在C語言中指針是一種系統定義的類型,在C++的面向對象思想中,指針是一種對象。總之指針的本質是計算機中訪問內存中數值的一種機制。指針的使用極大的提高了編程的靈活性的同時,也帶來了內存管理上的很多麻煩。


                                                 圖1:指針操作圖

        在圖1中,我們申明一個int類型的指針變量p,申明一個int變量b,賦予b的值爲C,每一個變量本身佔據一個存儲單元,具有內存地址,我們把變量b的地址d 賦給指針p,這樣p就指向了b,可以通過指針的方式,通過b的地址來訪問b變量的值C。這就是一個最基本的通過指針來訪問變量的例子。其中指針也具有類型,例如上面我們申明的是int型指針,就是告訴系統,指針p是用來指向一個int類型的變量,當我們通過指針定位到內存的某一塊內存中,就可以正確的讀取其中的數據。

        上面所述的基本指針用法,也被叫做一維指針,然而指針也是可以嵌套使用的,因此有了二維指針,多維指針。一般指針的嵌套使用到3維就夠了,更多維的指針的使用會帶來混亂,不僅不利於閱讀,也不利於指針的管理。二維指針通俗的解釋就是,指向指針的指針,在上述例子中,我們定義的p指針的類型是“指向int類型的指針”,p也有自己的地址,我們還可以在定義一個指針p2,讓p2指向p1的內存單元。此時的定義方式是“int ** p2;”,這樣我們就可以把p1指針的地址賦個p2,既而可以通過p2來兩次解地址引用訪問到變量b。這就是二維指針的用法,同理三維指針和更高維的指針,也是通過這種嵌套方式來增加間接引用的次數。

       另一個方面,指針的使用,與C語言中數組的使用緊密結合在一起,在C語言中一維數組的數組名,可以被看作是一個一維指針。例如定義一個一維數組:int array[10],此時數組名既可以通過下標訪問某一個數據單元,如“array[5]”,也可以按照指針的方式,通過“ *(array+6)”這種方式來訪問。我們還可以定義一個int類型的指針“int * p3=array”,然後把array直接賦值給p3,因爲在數組的定義中,數組名就是表示的地址,因此我們在賦值的過程中,不需要再用取地址符號,對array取地址後再賦值給p3. 賦值後的指針p3可以看成與數組名一樣,都可以通過兩種方式,直接使用下標和指針的方式來訪問數據單元。其實在編譯器中,使用下標訪問數據單元的方式,也是通過指針移位的方式來訪問內存單元,這種方式訪問數據能夠帶來更高的效率。

         因此二維指針,也就對應這二維數組,我們定義一個二維數組: int array2 [ 4 ][ 4 ].定義一個二維指針:int ** p4=array2;此時的二維指針已經指向了數組的首地址。在C語言中傳遞一個二維數組,最少應該給出二維數組中的第二維的長度,也就是每一行的數組元素個數,因爲二維數組在存儲上依然是按照一維來存儲,只是通過映射的方式來讓我看起來好像生成了一個二維數組,可以通過二維指標的方式來訪問某一個數據單元,在底層,這些都是通過一個首地址指針和偏移量的計算,來範圍存儲在一維內存單元中的數據。在數組中我們知道array2 [ 2 ]是表示的第三行數據的首地址,相當於一維數組的地址,對應到指針的表示方法就是:  * (p4+2) ;就如array2[ 2 ]所表示的地址一樣, * (p4+2) 表示的也是地址,並不能取得數組中存儲的數據,二維指針必須經過兩次解地址引用才能得到所指向的內存單元中的數據。如: *(* (p4+2) +2)就可以得到二維數組中的 array2[ 2 ][ 2 ]。同理三維數組和三維指針的對應關係也類似,一個三維指針第一次解地址引用,相當於成爲了一個指向二維數組的指針,一個n維指針需要經過n次解地址引用,才能訪問到所指向的數據單元中的數據。

       由於指針具有直接訪問內存數據的能力,因此給編程帶來了極大的方便。這也是C語言具有頑強生命力和高效的運行效率的一個很重原因。如果你看過一些底層的系統代碼,例如linux內核的源代碼,你會發現這些代碼中,你可以很容易看見指針的身影。另一方面由於指針具有直接訪問內存數據的權限,這也給系統帶來了風險和指針管理上的麻煩,例如由於忘記釋放不需要的指針,而帶來的內存泄漏等問題。因此在更高級的語言如C++中,對指針的使用,就提供了標準的封裝類庫,使得指針的使用更加合理和安全。

        以下時一些程序中對指針用法測試的實例:


      圖2-1  指針基本用法示意圖程序                                             圖2-2 指針基本用法示意圖程序運行結果 


                         圖 3-1 三維指針和三維數組測試程序


                                                         圖 3-2 三維指針和三維數組測試程序運行結果

如果你想在C語言中申請一個二維數組,它的每一維的空間大小都是你想設定的值,那麼你可以採用動態申請數組的方式:


                       圖 4-1 動態申請內存示例程序                                                                              圖4-2 動態申請內存示例程序運行結果

       

發佈了28 篇原創文章 · 獲贊 35 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章