天天看點

c語言重載函數聲明,用C語言來實作的類似C++函數的重載特性

我們在使用C庫函數的時候經常會碰到使用void*指針的現象,以前本人作為初學者并不太明白其中的奧妙,相信很多初學者跟我有同感。

我認為這些void*的使用恰恰很巧妙的實作了函數的“重載”特性 。

典型的如記憶體操作函數memcpy和memset的函數原型分别為:

void * memcpy(void *dest, const void *src, size_t len);

void * memset ( void * buffer, int c, size_t num );

它們的void*都可以接受任意類型指針,例如

int i[50];

memset ( i, 0, 50*sizeof(int) ); //将intarray清0

char a[50],b[50];

memcpy ( a, b, 50*sizeof(char) ); //将b拷貝給a

我們看到void*就像一個萬能的指針,來什麼我就處理什麼,當然函數内部的處理是關鍵,但是這種方法還是值得我們學習的。

關鍵是利用了任何類型的指針均可以對void*指派的特性;即:

void* p;

char *s;

int *i;

p = s;//将s位址賦給p

p = i;//将i位址賦給p

但是,當要把void*賦給其他指定類型的指針時,需要将其強制轉換,這點我們在使用的時候應該注意;

如上例:

s = p;//編譯錯誤,

s = (char*) p;//正确

p++;//錯誤

(char*)p++;//正确

(char*) p+=1//錯誤

有趣的是,memcpy和memset函數傳回的也是void *類型,當然這也是寫一個“純粹的,脫離低級趣味的”函數所必須的!

這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實地展現了記憶體操作函數的意義,因為它操作的對象僅僅是一片記憶體,而不論這片記憶體是什麼類型。

我們的實際運用當中可以有所借鑒,當有幾個功能相同而僅僅參數類型不同的函數時,我們可以将它們并到一個用void*指針作參數的函數中,可以提高程式的可讀性。

當然這僅僅是對C語言而言,C++中我們就别浪費精力在這兒了。^_~