C語言中函數指針具備重要的做用。模塊之間的調用,能夠用函數指針數組或者結構體,配合鉤子函數,構造一系列的API接口。數組
函數指針的賦值比較寬容,這也是一個優勢。代碼以下:函數
1 #include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 int a,b; 7 void (*pf1)() = NULL; 8 int (*pf2)(void* argIn,void* argOut) = NULL; 9 10 int func(int*a){ 11 *a = 1; 12 return 1; 13 } 14 int func1(int*a,int*b,int*c){ 15 *a = 1; 16 *b = 2; 17 *c = 3; 18 printf("c:0x%x ,c = %d\n",c,*c); 19 return 1; 20 } 21 //情形1 22 pf1 = func; 23 pf1(&a); 24 //情形2 25 pf2 = func; 26 pf2(&a);//錯誤 27 pf2(&a,&b); 28 //情形3 29 pf2 = func1; 30 pf2(&a,&b); 31 } 32
test.c:26:2: error: too few arguments to function ‘pf2’ spa
pf2(&a);
上述兩個賦值,只有17行是錯誤的,其餘都正確運行。指針
運行結果:code
[david@localhost code]$ ./test c:0xd0fa661c ,c = 3 [david@localhost code]$ ./test c:0x27b4936c ,c = 3 [david@localhost code]$ ./test c:0xef6b1e0c ,c = 3
結論:blog
不一樣類型的函數指針,能夠轉換。根據編譯器的不一樣,可能須要強制轉換,或者能夠直接轉換。接口
能夠看出,對於沒有參數的函數指針,能夠被有任意參數的函數指針賦值,函數也能正確運行,而且不用考慮返回值。內存
對於有參數的指針,能夠被有任意參數的函數指針賦值,可是函數在運行時,聲明的參數和傳入的參數須要吻合,一樣不用考慮返回值。編譯器
可是分兩種狀況,如情形2和情形3:string
當實際的函數如func的參數少於函數指針pf2的參數,調用pf2時,多出來的參數會被func忽略;
當實際的函數如func的參數多於函數指針pf2的參數,調用pf2時,根據運行結果看出,編譯器會爲func構造參數,存在重大隱患,可能致使內存被修改,應該避免。