唐婷
四川職業技術學院計算機科學系,四川 遂寧 629000
深入理解指針在C語言中的應用
唐婷
四川職業技術學院計算機科學系,四川 遂寧 629000
本文介紹指針的基本概念、特性,以及對c語言的重要性。描述指針在c語言中的應用,深入理解指針在c語言編程中所占有的地位,以及掌握這些方法對今后編程的作用。
c語言;指針;算法
c language; Pointer; Algorithm
在計算機工程中指針是一個用來指示一個內存地址的計算機語言的變量。指針常常出現在比較靠近機器語言的環境,這樣能更好地為底層軟件的編寫提供支持。指針一般指向一個函數或一個變量。在使用一個指針時,一個程序既可以直接使用這個指針所儲存的內存地址,又可以使用這個地址里儲存的變量或函數的值。
簡單地說其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數據,而指針包含的是一個指向內存中某個位置的地址。指針可以表示各種數據對象,如簡單變量、數組、數組元素、結構體、甚至是函數。
常說指針是c語言的靈魂,沒有學會指針的使用,就不能說學號了c語言。現階段c語言的主要應用于嵌入式系統、linux內核等對于性能要求高、硬件聯系比較密切的領域。在下面中主要探討三個問題:(1)c語言中指針的效率。(2)操作位段。(3)語言依靠指針實現算法。(4)指針幫助c語言簡化程序。(5)指針高級聲明。
1c語言中指針的效率
c語言可以說是高級語言中性能最快的,而其中指針是加快程序處理效率的保障。指針能使得c語言大大提高程序的性能,從下邊的例子來看:
在函數參數傳遞中,如果傳遞的數據量比較大,函數執行又很頻繁的話,使用指針就能夠大大提高程序的處理速度。以傳遞結構為例:
定義一個比較大的結構:


這樣的處理效率是很低的,再加上NUM又很大的話對于內核或者底層處理程序來說就是一場災難。因為在c語言的參數傳值調用方式要求把參數的一份拷貝傳遞給函數,如果NUM為1024,而且我們使用的機器上整型和浮點型都占用4個字節,那么占有空間就很大了。每次調用函數都會把這個結構復制到堆棧中,用了以后再丟棄。
如果我們采用指針的傳遞,如下:

這樣調用函數的時候就是把一個指向結構的指針傳遞進去。指針比整個結構小得多,所以把它壓到堆棧上效率就會提高很多。向函數傳遞指針的缺陷在于函數現在可以對調用程序的結構變量進行修改,如果不希望如此,可以在函數中使用const關鍵字來防止這類修改。
用指針操作位段能使得代碼閱讀更方便,更接近于思維。
位段的聲明和任何其他普通的結構成員聲明相同,但有兩個例外。首先,位段成員必須聲明為int、signed int或unsigned int類型。其次,在成員名的后面是一個冒號和一個整數,這個整數指定該位段所占用的位的數目[1]。
有以下位段操作:

這樣可以在聲明如下結構:

這樣通過下列訪問方式,就能更方便的訪問位段信息:

最廣為人知的就是鏈表的實現。有了指針,c語言實現鏈表就變的簡單,使用也很方便。比如下單向鏈表:

是一個最簡單的單向鏈表,如果沒有指針的幫助,c語言要想實現也是很困難。使用指針可以很優雅的實現鏈表:

通過上述定義的struct就能很容易的實現鏈表,并且在鏈表的插入、刪除、遍歷都能很直觀的使用。其他涉及指針的算法就很多了,比如二叉樹、堆、隊列等等,c語言都能使用指針方便的實現。
簡單介紹一下雙向鏈表的插入,能更深入的了解鏈表對于插入、刪除的方便性。雙鏈表的插入會出現三種情況:(1)新值可能插入中間位置。(2)新值可能插入鏈表頭。(3)新值可能插入鏈表尾。這里介紹新值插入中間位置的方法。

插入的new只需要修改指針的順序就可以:

c語言沒有面向對象編程,但是可以利用指針,模擬出來,簡化程序。比如最具代表性的是在linux內核協議棧里,對于多協議的處理,可以采用同一段代碼來實現,但是對于不同的傳輸協議,比如tcp、udp等使用的不同的處理函數。這里要靈活使用函數指針,大大簡化程序,提高效率。比如在Netfilter的處理中,對于不同傳輸協議都采用同一段代碼,首先注冊不同協議的處理函數。
注冊tcp的處理函數:


在使用的時候只需要查找到該處理函數即可用同一段代碼處理不同的協議:

使用該方法可以在整個程序的任何地方,只需要先查找是屬于何種處理方法,就能處理不同的函數。能使得同一段代碼,處理不同的事件,提高代碼效率。
高級的指針類型在linux內核,以及一些底層軟件上面應用很廣泛,雖然看上去會覺得比較難以理解,但是一旦理解以后編程會變得比較快捷。
比如函數指針:

從以上幾個函數指針可以看到,靈活這幾類指針對于函數的聲明,以及在面向對象的設計的時候都能應用到。
下面來分析兩個比較復雜的高級聲明:

def是一個二級指針,它指向的是一個一維數組的指針,數組的元素都是int。
int *(*def)[20];
def是一個指針,它指向一個一維數組,數組元素都是int*。
指針雖然有時候讓代碼看上去比較難以理解,但從以上幾個方面可以看到,不管是在執行效率,對于硬件操作的支持,都具有無可比擬的威力,對我們在實現各種復雜的算法,直接處理硬件上面都提供了很大的方便。
[1] Kenneth A.Reek.C和指針[M].北京:人民郵電出版社,2008.4
[2] Benvenuti.C.深入理解LINUX網絡技術內幕[M].北京:中國電力出版社,2009
[3] W.Richard Stevens.TCP/IP 詳解 卷1:協議[M].北京:機械工業出版社,2007.8
Understanding pointers in c language applications
Tang ting
Sichuan Vocational and Technical College, suining 629000 China
This article describes the basic concepts of pointers, features, and the importance of clanguage. Pointer in c language describes the application of indepth understanding ofthe pointer in c programming language the status of occupied, and the master of these methods for future programming role.
TP319
A
10.3969/j.issn.1001-8972.2012.10.061