• 
    

    
    

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

      ?

      函數(shù)指針的深入研究與應(yīng)用分析

      2015-07-13 02:00:05陸志平胡晨駿
      電腦知識(shí)與技術(shù) 2015年13期
      關(guān)鍵詞:數(shù)組

      陸志平 胡晨駿

      摘要:在根據(jù)不同條件選擇執(zhí)行不同函數(shù)的程序中,if-else if-elses或者witch/case結(jié)構(gòu)需要經(jīng)過多次匹配且執(zhí)行效率較低。該文對(duì)函數(shù)指針進(jìn)行深入分析與研究,提出了采用函數(shù)指針數(shù)組解決此類問題的觀點(diǎn),提高了程序的簡(jiǎn)潔性與效率。

      關(guān)鍵詞:函數(shù)指針;數(shù)組;switch/case

      中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)13-0230-02

      Abstract: In the program that perform different functions according to different conditions, the structure of if-else if-else or switch/case need to go through many times and low operating efficiency. This paper makes a deep analysis and research on the function pointer, have brought forward the viewpoint adopt the function pointer array to resolve this kind problem, that have raised program elegance and efficiency.

      Key words: function pointer;array;switch/case

      在項(xiàng)目開發(fā)中經(jīng)常會(huì)遇到根據(jù)不同條件選擇不同函數(shù)的問題。例如項(xiàng)目中需要調(diào)用各自的函數(shù)處理不同類別的信號(hào),這些信號(hào)采用統(tǒng)一的編碼表示。如:zyc000XXXXX、zyc001XXXXX等,編碼的3-5位為0-9之間的數(shù)字,線性排列,分別表示不同種類的信號(hào)。后面五個(gè)字符標(biāo)識(shí)該類別中的不同信號(hào)。在編程處理時(shí),一般會(huì)想到采用if-else if-else或者switch-case結(jié)構(gòu)來(lái)處理[1]。但是當(dāng)判斷的條件較多時(shí),程序就會(huì)變得冗長(zhǎng)、復(fù)雜,且效率降低。本文研究采用函數(shù)指針解決此類問題,減少冗余代碼,使得代碼更為簡(jiǎn)潔、高效[2-3]。

      1 函數(shù)指針

      C語(yǔ)言的函數(shù)在調(diào)用時(shí)會(huì)在內(nèi)存中占用一段存儲(chǔ)空間,這段存儲(chǔ)空間有一個(gè)起始地址,這個(gè)起始地址稱為函數(shù)的入口地址,即函數(shù)的指針[4]。在程序中,函數(shù)一般是通過函數(shù)名來(lái)調(diào)用的。與數(shù)組名類似,函數(shù)名也代表了函數(shù)的入口地址,是一個(gè)指針常量[5]。

      指針既然可以指向整型、字符型、數(shù)組等類型,當(dāng)然也能指向一個(gè)函數(shù)。因此可以定義一個(gè)指針變量,讓其值等于函數(shù)的入口地址,此指針變量即為指向函數(shù)指針變量[6],其存放的值即為函數(shù)指針。然后可以通過這個(gè)指針變量來(lái)調(diào)用該函數(shù)[7]。

      在C語(yǔ)言中,變量必須先定義后使用,指針變量也不例外[8]。函數(shù)指針變量的定義格式為:

      類型標(biāo)識(shí)符 (*指針變量名)( [ 形參類型1, 形參類型2,..., 形參類型n ] ) [9]

      其中:

      類型標(biāo)識(shí)符為指針變量所指向的函數(shù)的返回值類型。形參類型指的是函數(shù)指針?biāo)赶蚝瘮?shù)的形參的數(shù)據(jù)類型。若是函數(shù)沒有形參,定義時(shí)可省略[10]。

      例如:

      int (*p)(int, int);

      本語(yǔ)句定義了一個(gè)指向函數(shù)的指針變量,此函數(shù)返回值類型為int類型,有兩個(gè)int類型的參數(shù)[11]。

      在初始化指針變量時(shí),只需要把函數(shù)名賦值給指針變量即可[12]。使用指針變量調(diào)用函數(shù)可以采用如下格式:

      (*指針變量名)(實(shí)參列表) [13]

      例如下列代碼完成了一個(gè)函數(shù)指針變量的定義、初始化以及調(diào)用函數(shù)的過程:

      int max(int x, int y){

      /*函數(shù)體*/

      }

      int main(void){

      int a=3,b=4;

      int max(int,int); /*max函數(shù)的聲明*/

      int (*f) (int x, int y); /*定義一個(gè)函數(shù)指針變量f */

      f=max; /* 將max函數(shù)的入口地址賦給指針f */

      f(a,b); /*通過函數(shù)指針變量f調(diào)用max函數(shù) */

      }

      上述代碼中,在給函數(shù)指針變量f賦值時(shí),是將max函數(shù)的入口地址賦給f,而函數(shù)名max代表的就是函數(shù)的入口地址,所以賦值時(shí)max不需要括號(hào)和參數(shù),僅需要函數(shù)名即可。賦值后,函數(shù)指針f就指向函數(shù)max的入口地址,通過f(a,b)即完成了函數(shù)max的調(diào)用。

      2 函數(shù)指針數(shù)組應(yīng)用研究

      單個(gè)函數(shù)指針的應(yīng)用與函數(shù)名類似,但函數(shù)指針數(shù)組在處理具有大量條件與函數(shù)關(guān)聯(lián)時(shí)具有很大的優(yōu)勢(shì)[14]。

      如前言中所述,信號(hào)為zyc000XXXXX、zyc001XXXXX等字符串?dāng)?shù)據(jù),程序接收到傳過來(lái)的信號(hào)后,取其第3-5位的字符,并將其轉(zhuǎn)換為十進(jìn)制整數(shù),其值為0-999,這里將它稱為類型碼,要求每一個(gè)類型碼對(duì)應(yīng)一個(gè)函數(shù)來(lái)進(jìn)行處理。

      首先討論采用switch()來(lái)對(duì)類型碼進(jìn)行判斷[15],匹配成功后調(diào)用相應(yīng)的函數(shù),實(shí)現(xiàn)方法如下:

      witch(i){ /* 假設(shè)i為類型碼 */

      case 0: fun0(); break;

      case 1: fun1 (); break;

      case 999: fun999 (); break;

      default: break;

      }

      從上述代碼可以看到,這樣判斷的次數(shù)最少為1次,最多為1000次,平均為500次。而且每次接收到信號(hào)后都要進(jìn)行判斷,系統(tǒng)效率極低。

      如何提高程序的效率?我們可以將每一個(gè)信號(hào)的類型碼(0-999)類型綁定一個(gè)函數(shù)。程序接收到信號(hào)后,根據(jù)其類型碼值0-999便可以直接調(diào)用綁定的函數(shù)。而綁定函數(shù)的功能則可以通過函數(shù)指針數(shù)組來(lái)完成。

      在程序中定義一個(gè)1000個(gè)元素的函數(shù)指針數(shù)組,并將其元素初始化為定義好的函數(shù)的指針。這樣,類型碼的值對(duì)應(yīng)著函數(shù)指針數(shù)組的下標(biāo),從而完成了類型碼與函數(shù)指針的綁定。

      實(shí)現(xiàn)方法如下:

      /* 假設(shè)信號(hào)字符串為str,其類型碼為整型數(shù)值idata */

      #include

      int fun0(string str){ …}

      int fun1(string str){ …}

      int fun999(string str){ …}

      int main(void){

      /* 定義函數(shù)指針數(shù)組并初始化 */

      int (*p[1000])(string)={fun1, fun2,…,fun999};

      /* 這里的idata為信號(hào)的類型碼 */

      int type=idata;

      /*通過 (*p[ idata ])( str ) 實(shí)現(xiàn)綁定函數(shù)的調(diào)用*/

      (*p[ idata ])( str ) ;

      return 0;

      }

      從上面的方法可以看到,采用函數(shù)指針數(shù)組后,只需要一次調(diào)用就可以實(shí)現(xiàn)按需調(diào)用函數(shù)的功能,可見無(wú)論是程序編寫的簡(jiǎn)潔性或者程序運(yùn)行的效率都遠(yuǎn)遠(yuǎn)高于采用switch-case結(jié)構(gòu)[16]。

      3 結(jié)束語(yǔ)

      函數(shù)指針是C/C++中一個(gè)非常重要的知識(shí),但由于其概念較為抽象,使用技巧性強(qiáng),應(yīng)用復(fù)雜,且如果使用不當(dāng),會(huì)導(dǎo)致很嚴(yán)重的錯(cuò)誤[17],所以很多人沒有認(rèn)識(shí)到它在程序編寫中的作用。通過本篇介紹,希望大家合理的利用函數(shù)指針,設(shè)計(jì)出更為簡(jiǎn)潔、高效的程序。

      參考文獻(xiàn):

      [1] 譚浩強(qiáng). C程序設(shè)計(jì)[M]. 北京: 清華大學(xué)出版社, 2011: 220-222.

      [2] Chow F, Chan S, Kenny R, et al. A new algorithm for partial redundancy elimination based on SSA form[C]// Proc of ACMSIGPLAN Conference on Programming Language Design and Implementation. New York: ACM Press, 1997: 273-286.

      [3] Kennedy R, Ruthing O, LIU Shin-ming, et al. Partial redundancy elimination in SSA form[J]. ACM Trans on Programming Language and Systems, 1999, 21(3): 627-630.

      [4] 蘇小紅, 王宇穎, 孫志崗. C語(yǔ)言程序設(shè)計(jì)[M]. 北京: 高等教育出版社, 2011: 264-272.

      [5] Reek K A. C和指針[M]. 北京: 人民郵電出版社, 2008: 33-34.

      [6] Peter Van, Der LinDer. C專家編程[M]. 北京: 人民郵電出版社, 2008: 230-232.

      [7] stephen Prata.C Primer Plus[M]. 北京: 人民郵電出版社, 2005: 236-238.

      [8] Kernighan B W, Ritchie D M. C程序設(shè)計(jì)語(yǔ)言[M]. 北京: 機(jī)械工業(yè)出版社, 2004: 79-80.

      [9] Harbison III SP, Steele Jr GL[M]. C語(yǔ)言參考手冊(cè). 北京: 機(jī)械工業(yè)出版社, 2003: 95-97.

      [10] 許永達(dá). C語(yǔ)言指針錯(cuò)誤的分析及調(diào)試[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,23(3): 153-155.

      [11] 古輝, 喬凱旋. C++指針機(jī)制與源文件關(guān)聯(lián)關(guān)系的可視化研究[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(7): 238-238.

      [12] 劉宏, 李颯. C語(yǔ)言中用指針指向函數(shù)的方法及其高級(jí)處理技巧的研究與應(yīng)用[J].東北農(nóng)業(yè)大學(xué)學(xué)報(bào).1994,25(2):186-189.

      [13] 何靈敏, 許翔, 陸慧娟, 等. C++教學(xué)中變成習(xí)慣的養(yǎng)成[J]. 計(jì)算機(jī)教育, 2011(9): 64-67

      [14] 郭曦, 何炎祥, 張煥國(guó), 等. 一種改進(jìn)的指針安全分析算法[J]. 武漢大學(xué)學(xué)報(bào): 理工版, 2010, 56(2): 170-174.

      [15] 龔松顯, 董銳, 劉躍宣. 用函數(shù)指針替代Switch/Case語(yǔ)句的程序設(shè)計(jì)方法[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2014(9): 14-15.

      [16] 姚宇峰. 面向軟件可信性的可信指針分析技術(shù)綜述[J]. 計(jì)算機(jī)應(yīng)用研究, 2012, 29(2): 427-430.

      猜你喜歡
      數(shù)組
      透過觀察 抓住本質(zhì)
      ——巧解排列組合中的有序數(shù)組問題
      JAVA稀疏矩陣算法
      JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
      小論C之普通指針與一維、二維數(shù)組的關(guān)系
      更高效用好 Excel的數(shù)組公式
      基于案例的C語(yǔ)言數(shù)組教學(xué)
      辨析指針數(shù)組與數(shù)組指針
      Excel數(shù)組公式在林業(yè)多條件求和中的應(yīng)用
      基于元胞數(shù)據(jù)的多維數(shù)據(jù)傳遞機(jī)制
      尋找勾股數(shù)組的歷程
      南江县| 赤壁市| 武安市| 贵阳市| 金堂县| 保康县| 光山县| 额济纳旗| 精河县| 孝昌县| 敦化市| 文化| 根河市| 六枝特区| 阳山县| 平和县| 革吉县| 汉源县| 镇雄县| 阜南县| 准格尔旗| 青海省| 阿拉善右旗| 墨江| 水城县| 郑州市| 富民县| 巴彦淖尔市| 永宁县| 阿城市| 隆安县| 陇西县| 云和县| 茌平县| 福泉市| 延庆县| 沙洋县| 武强县| 民县| 荔波县| 分宜县|