在下面這篇文章中已經有對指標做過學習,
指標作為c語言中極為重要的部分,它在為程式設計師提供極大便利的同時似乎也隱藏了各種潛在的危險。
用好了指標,對c語言程式設計很有幫助;
用不好,程式可能隨時會出錯,並且引起問題的原因也很難查詢。
所以接下來就需要知道什麼時候該用指標,什麼時候不應該用。
只有在適當的時機去使用,才會達到它應有的目的。
1. 動態記憶體分配
linux預設的執行緒棧空間大小為8m位元組大小,如果分配的區域性變數過大導致棧溢位了,
系統就會發sigsegv訊號。
sh-3.2# ulimit -a | grep stack
stack size (kbytes, -s) 8192
sh-3.2#
棧:寶貴資源,從棧上直接分配記憶體具有速度快、使用方便以及不需要考慮資源**等優點;
堆:相對於棧而言,空間大,但是需要程式設計師手動的去分配和釋放,用不好會有記憶體洩漏的風險。
如果函式內部需要分配大塊記憶體,則應考慮使用malloc函式從堆上分配記憶體。
因為指標直接指向所分配記憶體塊的首位址,所以使用指標訪問方便。
2. 向子函式傳遞引數
在函式呼叫的過程中,函式引數都會在子函式中建立新的副本,這就要涉及到push/pop的動作。
如果引數過大,就會增大函式呼叫帶來的cpu開銷,並且棧空間會被更快的使用掉。
posix標準也規定,如果函式的引數不能儲存到乙個32bit暫存器中,
此時應該通過傳遞引數位址的方法來達到引數傳輸的目的。
另外引數個數較多時,也應該將其打包成結構體,再去傳遞結構體變數的位址以達到引數傳遞的目的。
注:符合posix標準的程式,具有更好的移植性。
這裡需要注意的一點就是多執行緒環境下,callback函式傳遞指標變數特別是區域性指標變數時一定要小心。
因為多執行緒環境,指令的執行序列可能會無法預知。詳細可以參考下面這篇文章中關於callback的學習,
3. 函式的返回值要返回指標
目前見得比較多的就是string相關的庫函式。
見得比較多的做法是函式中增加輸出引數,將資料輸出到指定的buffer中,
而函式的返回值用來作為函式是否執行成功的依據。
4. 訪問非連續的資料內容
比如訪問鍊錶、樹、圖等型別的資料時,使用指標訪問很方便。
因為這些資料結構節點本身就有乙個或多個指標,然後通過指標將各個節點連線起來,
從而形成了各種結構的資料。
指標是乙個讓人既愛又恨的東西,請小心的使用它。
C語言指標學習 二
1.c語言中,實參變數與形參變數之間的資料傳遞,是單向的 值傳遞 方式。指標變數做函式引數也要遵循這一規則。呼叫函式不可能改變實參指標變數的值,但可以改變實參指標變數所指向變數的值。我們知道函式的呼叫可以得到乙個返回值,而運用指標變數做引數,可以得到多個變化了的變數值。2.在主調函式中宣告所要求的數...
C語言學習筆記 指標(二)為什麼使用指標?
為什麼要使用指標 我們首先引入乙個例子 include include intmain a的位址是系統隨機分配的那麼我們如果想要把資料儲存在指定位址呢?include include intmain 另外假若我們通過編寫乙個函式要交換兩個資料 include include void swap in...
何時使用引用和指標
但是,請等一下 你懷疑地問,這樣的 會產生什麼樣的後果?char pc 0 設定指標為空值 char rc pc 讓引用指向空值這是非常有害的,毫無疑問。結果將是不確定的 編譯器能產生一些輸出,導致任何事情都有可能發生 因為引用肯定會指向乙個物件,引用應被初始化。string rs 錯誤,引用必須被...