国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

唐婷

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

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

唐婷

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

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

c語(yǔ)言;指針;算法

c language; Pointer; Algorithm

前言

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

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

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

1c語(yǔ)言中指針的效率

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

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

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

這樣的處理效率是很低的,再加上NUM又很大的話對(duì)于內(nèi)核或者底層處理程序來(lái)說(shuō)就是一場(chǎng)災(zāi)難。因?yàn)樵赾語(yǔ)言的參數(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)鍵字來(lái)防止這類修改。

2 操作位段

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

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

有以下位段操作:

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

這樣通過(guò)下列訪問(wèn)方式,就能更方便的訪問(wèn)位段信息:

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

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

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

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

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

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

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

c語(yǔ)言沒(méi)有面向?qū)ο缶幊蹋强梢岳弥羔?,模擬出來(lái),簡(jiǎn)化程序。比如最具代表性的是在linux內(nèi)核協(xié)議棧里,對(duì)于多協(xié)議的處理,可以采用同一段代碼來(lái)實(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ì)覺(jué)得比較難以理解,但是一旦理解以后編程會(huì)變得比較快捷。

比如函數(shù)指針:

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

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

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

int *(*def)[20];

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

6 結(jié)語(yǔ)

指針雖然有時(shí)候讓代碼看上去比較難以理解,但從以上幾個(gè)方面可以看到,不管是在執(zhí)行效率,對(duì)于硬件操作的支持,都具有無(wú)可比擬的威力,對(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)世代碼
基于鏈表多分支路徑樹(shù)的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
绥江县| 锡林浩特市| 庆城县| 拜泉县| 离岛区| 巴塘县| 霍山县| 康定县| 莱州市| 玉屏| 舞钢市| 宁城县| 开封市| 织金县| 海城市| 莒南县| 平乐县| 沙坪坝区| 灵石县| 如皋市| 农安县| 大洼县| 阿坝| 兴山县| 明溪县| 扎鲁特旗| 隆尧县| 黄平县| 金乡县| 苏尼特右旗| 天津市| 雷山县| 封丘县| 体育| 南丰县| 都匀市| 油尖旺区| 汾西县| 扬州市| 开原市| 抚松县|