• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      深入理解指針在C語言中的應(yīng)用

      2012-11-14 04:31:44唐婷
      中國(guó)科技信息 2012年10期
      關(guān)鍵詞:鏈表指針代碼

      唐婷

      四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000

      深入理解指針在C語言中的應(yīng)用

      唐婷

      四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000

      本文介紹指針的基本概念、特性,以及對(duì)c語言的重要性。描述指針在c語言中的應(yīng)用,深入理解指針在c語言編程中所占有的地位,以及掌握這些方法對(duì)今后編程的作用。

      c語言;指針;算法

      c language; Pointer; Algorithm

      前言

      在計(jì)算機(jī)工程中指針是一個(gè)用來指示一個(gè)內(nèi)存地址的計(jì)算機(jī)語言的變量。指針常常出現(xiàn)在比較靠近機(jī)器語言的環(huán)境,這樣能更好地為底層軟件的編寫提供支持。指針一般指向一個(gè)函數(shù)或一個(gè)變量。在使用一個(gè)指針時(shí),一個(gè)程序既可以直接使用這個(gè)指針?biāo)鶅?chǔ)存的內(nèi)存地址,又可以使用這個(gè)地址里儲(chǔ)存的變量或函數(shù)的值。

      簡(jiǎn)單地說其實(shí)指針就像是其它變量一樣,所不同的是一般的變量包含的是實(shí)際的真實(shí)的數(shù)據(jù),而指針包含的是一個(gè)指向內(nèi)存中某個(gè)位置的地址。指針可以表示各種數(shù)據(jù)對(duì)象,如簡(jiǎn)單變量、數(shù)組、數(shù)組元素、結(jié)構(gòu)體、甚至是函數(shù)。

      常說指針是c語言的靈魂,沒有學(xué)會(huì)指針的使用,就不能說學(xué)號(hào)了c語言?,F(xiàn)階段c語言的主要應(yīng)用于嵌入式系統(tǒng)、linux內(nèi)核等對(duì)于性能要求高、硬件聯(lián)系比較密切的領(lǐng)域。在下面中主要探討三個(gè)問題:(1)c語言中指針的效率。(2)操作位段。(3)語言依靠指針實(shí)現(xiàn)算法。(4)指針幫助c語言簡(jiǎn)化程序。(5)指針高級(jí)聲明。

      1c語言中指針的效率

      c語言可以說是高級(jí)語言中性能最快的,而其中指針是加快程序處理效率的保障。指針能使得c語言大大提高程序的性能,從下邊的例子來看:

      在函數(shù)參數(shù)傳遞中,如果傳遞的數(shù)據(jù)量比較大,函數(shù)執(zhí)行又很頻繁的話,使用指針就能夠大大提高程序的處理速度。以傳遞結(jié)構(gòu)為例:

      定義一個(gè)比較大的結(jié)構(gòu):

      這樣的處理效率是很低的,再加上NUM又很大的話對(duì)于內(nèi)核或者底層處理程序來說就是一場(chǎng)災(zāi)難。因?yàn)樵赾語言的參數(shù)傳值調(diào)用方式要求把參數(shù)的一份拷貝傳遞給函數(shù),如果NUM為1024,而且我們使用的機(jī)器上整型和浮點(diǎn)型都占用4個(gè)字節(jié),那么占有空間就很大了。每次調(diào)用函數(shù)都會(huì)把這個(gè)結(jié)構(gòu)復(fù)制到堆棧中,用了以后再丟棄。

      如果我們采用指針的傳遞,如下:

      這樣調(diào)用函數(shù)的時(shí)候就是把一個(gè)指向結(jié)構(gòu)的指針傳遞進(jìn)去。指針比整個(gè)結(jié)構(gòu)小得多,所以把它壓到堆棧上效率就會(huì)提高很多。向函數(shù)傳遞指針的缺陷在于函數(shù)現(xiàn)在可以對(duì)調(diào)用程序的結(jié)構(gòu)變量進(jìn)行修改,如果不希望如此,可以在函數(shù)中使用const關(guān)鍵字來防止這類修改。

      2 操作位段

      用指針操作位段能使得代碼閱讀更方便,更接近于思維。

      位段的聲明和任何其他普通的結(jié)構(gòu)成員聲明相同,但有兩個(gè)例外。首先,位段成員必須聲明為int、signed int或unsigned int類型。其次,在成員名的后面是一個(gè)冒號(hào)和一個(gè)整數(shù),這個(gè)整數(shù)指定該位段所占用的位的數(shù)目[1]。

      有以下位段操作:

      這樣可以在聲明如下結(jié)構(gòu):

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

      3 語言依靠指針實(shí)現(xiàn)算法

      最廣為人知的就是鏈表的實(shí)現(xiàn)。有了指針,c語言實(shí)現(xiàn)鏈表就變的簡(jiǎn)單,使用也很方便。比如下單向鏈表:

      是一個(gè)最簡(jiǎn)單的單向鏈表,如果沒有指針的幫助,c語言要想實(shí)現(xiàn)也是很困難。使用指針可以很優(yōu)雅的實(shí)現(xiàn)鏈表:

      通過上述定義的struct就能很容易的實(shí)現(xiàn)鏈表,并且在鏈表的插入、刪除、遍歷都能很直觀的使用。其他涉及指針的算法就很多了,比如二叉樹、堆、隊(duì)列等等,c語言都能使用指針方便的實(shí)現(xiàn)。

      簡(jiǎn)單介紹一下雙向鏈表的插入,能更深入的了解鏈表對(duì)于插入、刪除的方便性。雙鏈表的插入會(huì)出現(xiàn)三種情況:(1)新值可能插入中間位置。(2)新值可能插入鏈表頭。(3)新值可能插入鏈表尾。這里介紹新值插入中間位置的方法。

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

      4 指針幫助c語言簡(jiǎn)化程序

      c語言沒有面向?qū)ο缶幊?,但是可以利用指針,模擬出來,簡(jiǎn)化程序。比如最具代表性的是在linux內(nèi)核協(xié)議棧里,對(duì)于多協(xié)議的處理,可以采用同一段代碼來實(shí)現(xiàn),但是對(duì)于不同的傳輸協(xié)議,比如tcp、udp等使用的不同的處理函數(shù)。這里要靈活使用函數(shù)指針,大大簡(jiǎn)化程序,提高效率。比如在Netfilter的處理中,對(duì)于不同傳輸協(xié)議都采用同一段代碼,首先注冊(cè)不同協(xié)議的處理函數(shù)。

      注冊(cè)tcp的處理函數(shù):

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

      使用該方法可以在整個(gè)程序的任何地方,只需要先查找是屬于何種處理方法,就能處理不同的函數(shù)。能使得同一段代碼,處理不同的事件,提高代碼效率。

      5 指針高級(jí)聲明

      高級(jí)的指針類型在linux內(nèi)核,以及一些底層軟件上面應(yīng)用很廣泛,雖然看上去會(huì)覺得比較難以理解,但是一旦理解以后編程會(huì)變得比較快捷。

      比如函數(shù)指針:

      從以上幾個(gè)函數(shù)指針可以看到,靈活這幾類指針對(duì)于函數(shù)的聲明,以及在面向?qū)ο蟮脑O(shè)計(jì)的時(shí)候都能應(yīng)用到。

      下面來分析兩個(gè)比較復(fù)雜的高級(jí)聲明:

      def是一個(gè)二級(jí)指針,它指向的是一個(gè)一維數(shù)組的指針,數(shù)組的元素都是int。

      int *(*def)[20];

      def是一個(gè)指針,它指向一個(gè)一維數(shù)組,數(shù)組元素都是int*。

      6 結(jié)語

      指針雖然有時(shí)候讓代碼看上去比較難以理解,但從以上幾個(gè)方面可以看到,不管是在執(zhí)行效率,對(duì)于硬件操作的支持,都具有無可比擬的威力,對(duì)我們?cè)趯?shí)現(xiàn)各種復(fù)雜的算法,直接處理硬件上面都提供了很大的方便。

      [1] Kenneth A.Reek.C和指針[M].北京:人民郵電出版社,2008.4

      [2] Benvenuti.C.深入理解LINUX網(wǎng)絡(luò)技術(shù)內(nèi)幕[M].北京:中國(guó)電力出版社,2009

      [3] W.Richard Stevens.TCP/IP 詳解 卷1:協(xié)議[M].北京:機(jī)械工業(yè)出版社,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

      猜你喜歡
      鏈表指針代碼
      基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
      偷指針的人
      跟麥咭學(xué)編程
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      基于鏈表多分支路徑樹的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
      為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
      临海市| 察隅县| 张家港市| 锡林郭勒盟| 民乐县| 长顺县| 芜湖市| 乌兰县| 池州市| 大新县| 漾濞| 方正县| 台山市| 汕尾市| 南漳县| 南丰县| 曲水县| 玉门市| 马鞍山市| 隆回县| 临海市| 藁城市| 东台市| 淳安县| 平南县| 淮北市| 无为县| 齐河县| 镶黄旗| 石景山区| 晋中市| 临汾市| 博客| 舟山市| 郓城县| 策勒县| 广灵县| 宣化县| 荆门市| 鄢陵县| 灵璧县|