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

?

函數(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)過(guò)多次匹配且執(zhí)行效率較低。該文對(duì)函數(shù)指針進(jìn)行深入分析與研究,提出了采用函數(shù)指針數(shù)組解決此類(lèi)問(wèn)題的觀(guān)點(diǎn),提高了程序的簡(jiǎn)潔性與效率。

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

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

1 函數(shù)指針

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

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

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

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

其中:

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

例如:

int (*p)(int, int);

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

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

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

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

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); /*通過(guò)函數(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的入口地址,通過(guò)f(a,b)即完成了函數(shù)max的調(diào)用。

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

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

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

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

witch(i){ /* 假設(shè)i為類(lè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)的類(lèi)型碼(0-999)類(lèi)型綁定一個(gè)函數(shù)。程序接收到信號(hào)后,根據(jù)其類(lèi)型碼值0-999便可以直接調(diào)用綁定的函數(shù)。而綁定函數(shù)的功能則可以通過(guò)函數(shù)指針數(shù)組來(lái)完成。

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

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

/* 假設(shè)信號(hào)字符串為str,其類(lèi)型碼為整型數(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)的類(lèi)型碼 */

int type=idata;

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

(*p[ idata ])( str ) ;

return 0;

}

從上面的方法可以看到,采用函數(shù)指針數(shù)組后,只需要一次調(diào)用就可以實(shí)現(xiàn)按需調(diào)用函數(shù)的功能,可見(jiàn)無(wú)論是程序編寫(xiě)的簡(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)致很?chē)?yán)重的錯(cuò)誤[17],所以很多人沒(méi)有認(rèn)識(shí)到它在程序編寫(xiě)中的作用。通過(guò)本篇介紹,希望大家合理的利用函數(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專(zhuān)家編程[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] 姚宇峰. 面向軟件可信性的可信指針?lè)治黾夹g(shù)綜述[J]. 計(jì)算機(jī)應(yīng)用研究, 2012, 29(2): 427-430.

猜你喜歡
數(shù)組
透過(guò)觀(guān)察 抓住本質(zhì)
——巧解排列組合中的有序數(shù)組問(wèn)題
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ù)組的歷程
德化县| 孝义市| 乐业县| 义马市| 衡阳县| 张家口市| 潞城市| 桂林市| 肥东县| 黄平县| 滦南县| 全南县| 岑巩县| 昔阳县| 广东省| 沙田区| 莱西市| 东乡族自治县| 田阳县| 临朐县| 崇明县| 图们市| 徐州市| 苏尼特右旗| 宣城市| 临西县| 大埔区| 金川县| 徐汇区| 楚雄市| 乐平市| 博野县| 宜都市| 凉城县| 揭东县| 永年县| 德清县| 秭归县| 黄山市| 县级市| 年辖:市辖区|