C的函數指針的做用,以及其賦值是弱類型的

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構造參數,存在重大隱患,可能致使內存被修改,應該避免。

相關文章
相關標籤/搜索