a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言泛型編程實例教程

2020-01-26 15:20:25
字體:
來源:轉載
供稿:網(wǎng)友

本文實例講述了C語言泛型編程的方法,分享給大家供大家參考之用。具體分析如下:

首先,泛型編程讓你編寫完全一般化并可重復使用的算法,其效率與針對某特定數(shù)據(jù)類型而設計的算法相同。在C語言中,可以通過一些手段實現(xiàn)這樣的泛型編程。這里介紹一種方法――通過無類型指針void*

看下面的一個實現(xiàn)交換兩個元素內容的函數(shù)swap,以整型int為例:

void swap(int* i1,int* i2){      int temp;      temp = *i1;      *i1 = *i2;      *i2 = temp; } 

當你想交換兩個char類型時,你還得重寫一個參數(shù)類型為char的函數(shù),是不是能用無類型的指針來作為參數(shù)呢?看如下改動:

void swap(void *vp1,void *vp2){     void temp = *vp1;     *vp1 = *vp2;     *vp2 = temp; } 

但是這段代碼是錯誤的,是通不過編譯的。首先,變量是不能聲明為void無類型的。而你不知道調用此函數(shù)傳進的參數(shù)是什么類型的,無法確定一種類型的聲明。同時,不能將*用在無類型指針上,因為系統(tǒng)沒有此地址指向對象大小的信息。在編譯階段,編譯器無法得知傳入此函數(shù)參數(shù)的類型的。這里要想實現(xiàn)泛型的函數(shù),需要在調用的地方傳入相關要交換的對象的地址空間大小size,同時利用在頭文件string.h中定義的memcpy()函數(shù)來實現(xiàn)。改動如下:

void swap(void *vp1,void *vp2,int size){    char buffer[size];//注意此處gcc編譯器是允許這樣聲明的   memcpy(buffer,vp1,size);    memcpy(vp1,vp2,size);    memcpy(vp2,buffer,size); } 

在調用這個函數(shù)時,可以像如下這樣調用(同樣適用于其它類型的x、y):

int x = 27,y = 2; swap(&x,&y,sizeof(int)); 

下面看另一種功能的函數(shù):

int lsearch(int key,int array[],int size){   for(int i = 0;i < size; ++i)         if(array[i] == key)              return i;   return -1;}

此函數(shù)在數(shù)組array中查找key元素,找到后返回它的索引,找不到返回-1.如上,也可以實現(xiàn)泛型的函數(shù):

void* lsearch(void* key, void *base, int n, int elemSize){  for(int i = 0;i < n; ++i){    void *elemAddr = (char *)base+i*elemSize;    if(memcmp(key, elemAddr, elemSize) == 0)      return elemAddr;  }  return NULL;}

代碼第三行:將數(shù)組的首地址強制轉換為指向char類型的指針,是利用char類型大小為1字節(jié)的特性,使elemAddr指向此”泛型“數(shù)組的第i-1個元素的首地址。因為之前已經說過,此時你并不知道你傳入的是什么類型的數(shù)據(jù),系統(tǒng)無法確定此數(shù)組一個元素有多長,跳向下個元素需要多少字節(jié),所以強制轉換為指向char的指針,再加上參數(shù)傳入的元素大小信息和累加數(shù)i的乘積,即偏移地址,即可得此數(shù)組第i-1個元素的首地址。這樣使無論傳入的參數(shù)是指向什么類型的指針,都可以得到指向正確元素的指針,實現(xiàn)泛型編程。

函數(shù)memcmp()原型:int memcmp(void *dest,const void *src,int n),比較兩段長度為n首地址分別為dest、src的地址空間中的內容。

此函數(shù)在數(shù)組base中查找key元素,找到則返回它的地址信息,找不到則返回NULL。

如果使用函數(shù)指針,則可以實現(xiàn)其行為的泛型:

void *lsearch(void *key,void *base,int n,int elemSize,int(*cmpfn)(void*,void*,int)){  for(int i = 0;i < n; ++i){    void *elemAddr = (char *)base+i*elemSize;    if(cmpfn(key,elemAddr,elemSize) == 0)      return elemAddr;  }  return NULL;}

再定義一個要調用的函數(shù):

int intCmp(void* elem1,void* elem2){    int* ip1 = elem1;    int* ip2 = elem2;    return *ip1-*ip2;}

看如下調用:

int array[] = {1,2,3,4,5,6};int size = 6;int number = 3;int *found = lsearch(&number,array,size,sizeof(int),intCmp);if(found == NULL)     printf("NO/n");else     printf("YES/n");

C語言也可以實現(xiàn)一定的泛型編程,但這樣是不安全的,系統(tǒng)對其只有有限的檢查。在編程時一定要多加細心。

相信本文所述對大家C程序設計的學習有一定的借鑒價值。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 久久第一区 | 免费观看一级特黄欧美大片 | 亚洲精品乱码久久久v下载方式 | 欧美精品日韩 | 欧美区国产区 | 日批的视频 | 国产精品美女久久久久久久久久久 | 久久成人精品视频 | 超碰激情| 国产一区二区三区久久久 | 中文字幕免费看 | 成人做爰69片免费 | 国产精品成人国产乱一区 | 欧美成人h版在线观看 | 久久夜色精品 | 亚洲天堂免费 | 性视频一区二区 | 成人欧美一区二区三区黑人孕妇 | 成人在线免费 | 国产xxx在线观看 | 国产成人av在线 | 日本在线观看网站 | 欧美美女爱爱视频 | 日韩一二三区视频 | www.狠狠干 | 黄色国产一级视频 | 日韩在线免费 | 欧美日韩中文在线观看 | 成人久久久精品国产乱码一区二区 | 一区二区三区日韩 | 黄色影音 | 国产玖玖 | 国产精品成人一区二区三区夜夜夜 | 黄色大片免费网址 | 激情婷婷丁香 | 日韩视频一区二区三区四区 | 久久电影网 | 成人在线小视频 | 国产精品2区 | 日日摸天天爽天天爽视频 | 青青草网|