Linux C程式設計 指標預習需要注意的地方
1.指標的優勢與劣勢
一個很好利用的指標的程式會非常高效、簡介和精緻。利用指標可以將資料寫入記憶體中的任何位置,但是一旦程式中出現一個指向錯誤位置的指標,那麼存放在堆中的資料可能被破壞,用來處理堆的資料結構也可能被破壞,甚至作業系統的資料也可能會被修改。
值得我們注意的是,即使程式中出現了根本性的錯誤,程式可能還會裕興很長一段時間才會有明顯的失常表現;或者在被除錯時,程式完全執行正常,只有使用者使用它的時候才會失常。
在C語言程式中,任何野指標或越界的陣列下標都可能使系統崩潰。兩次釋放記憶體的操作也會導致這種結果。當然,我們可以藉助一些工具來幫助我們發現記憶體分配中存在的問題,如記憶體空洞、兩次釋放一個指標、野指標、越界下標等。
2.指標是變數
指標是變數,也有變數的特性。
系統為指標分配記憶體空間;指標有自己的地址;指標能夠存值,只是這個值比較特殊——地址
3.指標的型別和指標所指向的型別
指標的型別:只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別,這是指標本身所具有的型別 指標所指向的型別:只要把指標宣告語句中的指標名字和名字左邊的指標宣告符“ * ”去掉,剩下的就是指標所指向的型別。
4.指標的值
指標的值也叫指標所指向的記憶體區或地址。指標的值是指標本身儲存的數值,這個值被編譯器當作一個地址。在32位程式裡,所有型別的指標的值都是一個32位整數,因為32位程式裡記憶體地址全部都是32位長。指標所指向的記憶體區就是從指標的值所代表的那個記憶體地址開始,長度為sizeof(指標所指向的型別)的一片記憶體區。 我們說一個指標的值是XX,就相當於說該指標指向例以XX為首地址的一片記憶體區域;我們說一個指標指向了某塊區域,就相當於說該指標的值是這塊區域的首地址。
5.指標的運算
指標加上一個整數的結果是另一個指標。
指標的算術運算有三種形式。第一種形式是:指標 +- 整數,標準定義的這種形式只能用於指向陣列某個元素的指標,這類表示式的結果型別也是指標。注意:如果進行完假髮或者減法運算過後,指標指向的位置不在陣列範圍內,會發生陣列越界,對這個指標執行間接訪問,引用操作可能會失敗。第二種形式是:指標 - 指標,只有兩個指標都指向同一個陣列中的元素時,才允許從一個指標減去另一個指標。結果型別是ptrdiff t,是一種有符號的整數型別。減法運算的值是兩個指標在記憶體中的距離,因此減法運算結果將除以陣列元素型別的長度。間接引用:對已說明的變數來說,變數名就是對物件值得直接引用。對於指向變數或記憶體中任何物件的指標來說,指標就是對物件值得間接引用。
6.常量指標和指標常量
一個常量指標,即指向一個常量的指標,指向的內容是常量,不可修改,是存放在常量區的,但指標本身可以修改(指標可以指向不同的地址);一個指標常量,即指標本身是個常量,不可修改,但指標指向的內容可以修改。在常量指標中,對求字串長度與字串複製時特別有用。
7.空指標及其應用
在程式中需要使用這樣一種指標,它並不指向任何物件,這種指標被稱為空指標。空指標的值是NULL。警告:絕不能間接引用一個空指標,不然,程式可能會得到一個毫無意義的結果,或者一個全部是0的值,或者會忽然停止執行。用空指標可以中止對遞迴資料結構的間接引用;用空指標進行函式呼叫失敗時的返回值;用空指標作警戒值。
8.萬能指標 :void
void 指標一般被稱為通用指標或泛指針,void 指標指向某個物件,但該物件不屬於任何型別。在C語言中,任何時候都可以用其他型別的指標來代替void指標,或者用void 指標來代替其他型別的指標,並不需要強制型別轉換。當進行存粹的記憶體操作時,或者傳遞一個指向尚未定型別的指標時,可以使用void 指標。void 指標也經常用作函式指標。
9.指標陣列與陣列指標
指標陣列 “ typename * p [n]”定義了一個數組,陣列包含了n個指標變數。指標陣列符合一般陣列的特性,除了陣列中的元素是指標以外,和一般陣列沒什麼區別。陣列指標:指向陣列的指標。陣列名可以看作一個指向陣列的指標。
10.函式指標和指標函式
函式指標:即指向這個函式的指標,定義為 “資料型別 (*fun )(引數列表)”指標函式:即返回值是指標的函式,定義為 “資料型別 * fun (引數列表 )”。當函式的返回值是指標型別時,應該儘量不要返回區域性變數的指標,因為區域性變數是定義在函式內部,當這個函式呼叫結束了,區域性變數的棧記憶體也被釋放例,因此不能夠正確得到返回值。
11.複雜指標宣告
理解法則:右左法則
從最內部的括號開始閱讀宣告,向右看,然後向左看。當你碰到一個括號時就調轉閱讀的方向。括號內的內容都分析完畢就跳出括號的範圍。當在第一次開始閱讀宣告時,必須從變數名開始,而不是最內部的括號。
複雜指標宣告可能會用到 const 修飾符,typedef 以及函式指標等等;