如果要寫個函數(shù)支持多種數(shù)據(jù)類型,首先想到的就是C++的模板了,但是有時候只能用C語言,比如在linux內(nèi)核開發(fā)中,為了減少代碼量,或者是某面試官的要求…
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、內(nèi)黃ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的內(nèi)黃網(wǎng)站制作公司
考慮了一陣子后,就想到了qsort上.qsort的函數(shù)原型:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
快排時,只要自己實現(xiàn)相應(yīng)數(shù)據(jù)類型的比較函數(shù)cmpare就可以了.如果比較int型時,一個典型的compare函數(shù)如下:
那么,就是說可以利用void *. void *意指未指定類型,也可以理解為任意類型。其他類型的指針可以直接賦值給void *變量,但是void *變量需要強(qiáng)制類型轉(zhuǎn)換為其它指針類型。這個相信大家都知道。那么下面以一個簡單的題目為例,來探討如何在C語言中實現(xiàn)模板函數(shù)。
方法1: 利用void *.
在看下面的源程序之前,需要了解幾點。首先,在32位平臺上,任何類型的指針?biāo)嫉淖止?jié)都是4個字節(jié),因為32位機(jī)器虛擬內(nèi)存一般為4G,即2的32次方,只要32位即4個字節(jié)就可以足夠?qū)ぶ?,sizeof(void *)=4; 其次,雖然各種不同類型的指針?biāo)嫉目臻g都為4個字節(jié),但是不同類型的指針?biāo)傅目臻g的字節(jié)數(shù)卻不同(這一點尤為重要,下面的程序我在開始沒有調(diào)通就因為這點意識不強(qiáng))。所以,如果你將一個指針強(qiáng)制轉(zhuǎn)換為另一個類型的指針,指針本身所占的字節(jié)是不變的,但是,如果對這個指針進(jìn)行運算,比如 *p,p++,p-=1等一般都是不同的。 再次,函數(shù)指針應(yīng)該了解下,這里不多說。 最后,因為Sandy跟我說,C++開始的時候模板的實現(xiàn)其實就是利用宏替換,在編譯的時候確定類型。所以,為了方便,類型也用了預(yù)編譯指令#define。
span#include?"stdio.h"/span
span#include?"stdlib.h"/span
span//typedef?int?T;??//或者下面的也可以./span
span#define??T?int/span
//這個FindMin是Sandy寫的.felix021也寫了個,差不多的就不貼出來的.
void?FindMin(const?void??*arr,int?arr_size,int?arrmembersize,int?*index,
int?(*cmp)(const?void?*,const?void?*b)){
int?i;
*index=0;
char?*p=(char?*)arr;
char?*tmp=p;
for?(i=1;iarr_size?;i++){
if?(cmp(tmp,p)0){
tmp=p;
}
p+=arrmembersize;
}
(*index)=((int)(tmp-arr))/arrmembersize;
}
*//span
可以把指針看作是char?*,如果轉(zhuǎn)換為int?*,那下面的位移就不正確了./span
indexspan=/spanispan;/span
span}/span
span}/span
spanreturn/span?indexspan;/span
span}/span
spanint/span?resultspan;/spanspan//result保存的是最小值索引./span
resultspan=/spanFindMinspan(/spanarr,span12/span,
C語言的函數(shù)定義格式是:
函數(shù)類型 函數(shù)名稱 ( 參數(shù)列表 )
{
//函數(shù)體
}
函數(shù)聲明,不是說明的格式是“函數(shù)定義格式”的第一行,然后加 “;”,即:
函數(shù)類型 函數(shù)名稱 ( 參數(shù)列表 );
特別地,在函數(shù)聲明中的參數(shù)列表中,不需要給出具體的變量名稱,但必須給出每個變量的類型。
函數(shù)定義就是規(guī)定函數(shù)的格式與功能。
函數(shù)聲明就是在函數(shù)調(diào)用之前進(jìn)行的一種說明。
下面舉例說明兩者的語法格式:
#includestdio.h
int?fun(int?a,?int?b);??//?函數(shù)的聲明
void?main()
{
int?x=1,?y=2;
int?c;
c?=?fun(x+y);
}
//?下面的fun函數(shù)就是函數(shù)的定義
int?fun(int?a,?int?b)
{
return?a+b;
}
注:如果被調(diào)函數(shù)(上例中為fun函數(shù))寫在調(diào)用處之前,可以不聲明(本例是現(xiàn)在調(diào)用處?(c = fun(x+y);)之后)。
編寫程序如下:
#includestdio.h
void main()
{
y=x*x;
if(x-1)
y=x*x-1;
printf("%lf",y);
}
或:
#include“stdio.h”
#include“math.h”
int main()
{
double x,y;
printf("please input a number:");
return 0;
}
數(shù)學(xué)函數(shù)
所在函數(shù)庫為math.h、stdio.h、string.h、float.h
int abs(int i) 返回整型參數(shù)i的絕對值
double cabs(struct complex znum) 返回復(fù)數(shù)znum的絕對值
double fabs(double x) 返回雙精度參數(shù)x的絕對值
long labs(long n) 返回長整型參數(shù)n的絕對值
double exp(double x) 返回指數(shù)函數(shù)ex的值
以上內(nèi)容參考:百度百科-C語言函數(shù)
名稱欄目:c語言函數(shù)樣板,c語言程序設(shè)計模板
文章地址:http://aaarwkj.com/article0/dsiesoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站改版、靜態(tài)網(wǎng)站、網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)