程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言實現泛型編程(1)

C語言實現泛型編程(1)

編輯:關於C語言

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

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

 swap(* i1,*= **i1 = **i2 =

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

 swap( *vp1, * temp = **vp1 = **vp2 =

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

 swap( *vp1, *vp2, buffer[size];

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

 x = ,y = &x,&y,());  

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

 lsearch( key, array[],( i = ;i < size; ++(array[i] == -

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

* lsearch(* key,  *,  n, ( i = ;i < n; ++ *elemAddr = ( *)+i*(memcmp(key, elemAddr, elemSize) == 

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

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

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

 *lsearch( *key, *, n, elemSize,(*cmpfn)(*,*,( i = ;i < n; ++ *elemAddr = ( *)+i*(cmpfn(key,elemAddr,elemSize) == 

 intCmp(* elem1,** ip1 =* ip2 = *ip1-*

看如下調用:

 array[] = {,,,,, size =  number =  *found = lsearch(&number,array,size,((found ==);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved