亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言泛型編程實例教程

2020-01-26 15:20:25
字體:
來源:轉載
供稿:網友

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

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

看下面的一個實現交換兩個元素內容的函數swap,以整型int為例:

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

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

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

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

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

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

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

下面看另一種功能的函數:

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

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

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;}

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

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

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

如果使用函數指針,則可以實現其行為的泛型:

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;}

再定義一個要調用的函數:

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語言也可以實現一定的泛型編程,但這樣是不安全的,系統對其只有有限的檢查。在編程時一定要多加細心。

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

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美夫妻视频在线观看| 国产精品白丝jk喷水视频一区| 国产精品一区二区三区免费视频| 理论片在线不卡免费观看| 亚洲在线视频福利| 国产亚洲精品一区二555| 国产成人精品优优av| 国产伦精品一区二区三区精品视频| 国产精品视频一| 久久激情五月丁香伊人| 久久久亚洲精品视频| 精品无码久久久久久国产| 美女视频黄免费的亚洲男人天堂| 久久久这里只有精品视频| 91精品久久久久久久久青青| 亚洲女人天堂av| 日本91av在线播放| 亚洲日本中文字幕免费在线不卡| 久久久精品一区二区三区| 91网在线免费观看| 亚洲v日韩v综合v精品v| 国产精品观看在线亚洲人成网| 正在播放欧美一区| 日韩av影院在线观看| 久久久久久久久久久国产| 国产91精品最新在线播放| xxxx性欧美| 青草热久免费精品视频| 精品国产一区二区三区久久久狼| 国产成人福利网站| 国产精品网址在线| 亚洲免费av电影| 亚洲xxx大片| 欧美成人精品在线视频| 91po在线观看91精品国产性色| 欧美日韩成人免费| 在线观看欧美视频| 久久久久久999| 欧美激情精品久久久久久大尺度| 日韩免费视频在线观看| 啪一啪鲁一鲁2019在线视频| 色av吧综合网| 国内精品久久久久影院优| 91在线视频九色| 日韩av免费看| 精品视频一区在线视频| 国产黑人绿帽在线第一区| 国产精品久久久久久av福利软件| 亚洲男人第一av网站| 久久精品国产2020观看福利| 国产精品视频1区| 久久精品国产一区| 欧美日韩国产成人在线观看| 成人黄色在线观看| 欧美成人高清视频| 91精品国产色综合久久不卡98口| 欧美成人精品三级在线观看| 亚洲欧美日韩视频一区| 国产亚洲欧洲高清| 久久精品夜夜夜夜夜久久| 国产精品久久久一区| 最近2019中文字幕在线高清| 国产成人av网址| 日本伊人精品一区二区三区介绍| 操人视频在线观看欧美| 亚洲九九九在线观看| 欧美精品videosex牲欧美| 国产91久久婷婷一区二区| 亚洲日本成人网| 欧美色图在线视频| 97精品一区二区三区| 亚洲一区二区久久| 亚洲欧美日韩精品久久| 欧美大肥婆大肥bbbbb| 日韩福利视频在线观看| 91久久在线播放| 久久精品一本久久99精品| 亚洲码在线观看| 超碰精品一区二区三区乱码| 亚洲国产中文字幕久久网| 久久久国产视频91| 国产成人拍精品视频午夜网站| 日韩欧美在线中文字幕| 久久人人爽人人爽人人片av高请| 欧美激情图片区| 日韩一级黄色av| 日韩欧美一区二区三区久久| 国产精品久久久精品| 日韩美女免费视频| 亚洲欧洲免费视频| 国产亚洲精品综合一区91| 久久99热这里只有精品国产| 国产精品久久一区主播| 操人视频在线观看欧美| 成人自拍性视频| 亚洲激情视频在线播放| 日韩欧美一区二区三区| 欧美高清无遮挡| 国产精品入口免费视频一| 日韩av在线免费观看| 国产精品久久久久77777| 久久久午夜视频| 欧美片一区二区三区| 国产精品福利在线观看| 亚洲人成在线免费观看| 成人精品久久av网站| 欧美极品少妇全裸体| 97久久精品国产| 8x拔播拔播x8国产精品| 亚洲新声在线观看| 亚洲精品成人av| 北条麻妃久久精品| 午夜精品久久久久久99热| 日韩成人av网| 亚洲mm色国产网站| 欧美日韩亚洲成人| 青青精品视频播放| 91精品国产乱码久久久久久久久| 国产精品视频色| 91久久精品在线| 亚洲午夜av久久乱码| 精品无码久久久久久国产| 中文字幕日韩欧美精品在线观看| 国产成人av网址| 日韩电影免费在线观看| 久久精品视频在线播放| 久久亚洲一区二区三区四区五区高| 青青草原成人在线视频| 亚洲欧美精品一区| 亚洲精品www久久久久久广东| 最近日韩中文字幕中文| 成人女保姆的销魂服务| 亚洲女人天堂色在线7777| 亚洲精品自在久久| 精品中文视频在线| 欧美激情视频在线免费观看 欧美视频免费一| 热草久综合在线| 亚洲精品美女久久久| 欧美天堂在线观看| 懂色av中文一区二区三区天美| 青青精品视频播放| 久久免费国产精品1| 久久综合色影院| 日韩欧美有码在线| 精品亚洲精品福利线在观看| 国产精品久久久久久久久久尿| 日韩电影网在线| 亚洲免费成人av电影| 日韩激情av在线免费观看| 久久久精品久久久久| 午夜精品久久久久久99热| 国产福利精品在线| 欧美性高跟鞋xxxxhd| 91chinesevideo永久地址| 日韩av电影中文字幕| 91干在线观看| 成人黄色中文字幕| 国产精品xxx视频| 亚洲www视频| 亚洲国产成人精品女人久久久| 国产成人av在线播放| 国产亚洲欧洲黄色| 亚洲国产天堂久久综合网| 国产91在线播放精品91|