先上一段代碼:數組
#include<stdio.h> typedef int (*FUNADD)(const int value1,const int value2); FUNADD func; int (*subFun)(const int value1,const int value2); int sub(const int value1,const int value2) { return value1-value2; } int add(const int value1 ,const int value2) { return value1+value2; } int main() { func = add; printf("func=%p *func=%p &func=%p\n",func,*func,&func); printf("add = %d\n",(*func)(1,2)); subFun = sub; printf("subFun=%p *subFun=%p &subFun = %p\n",subFun,*subFun,&subFun); printf("sub = %d\n",subFun(2,1)); printf("sub=%p *sub =%p &sub =%p\n",sub ,*sub ,&sub ); return 0; }
結果:ide
通過一段時間的工做,處處都在用函數指針;閒的時候總結下。函數
1、函數指針指針
int (*subFun)(const int value1,const int value2);
一、這個東西一看就是指針對吧,由於帶了括號,因此確定不是返回值爲指針的函數了;那他就是函數指針了,不知道你明白了嗎。(由於*是和函數先結合的)blog
二、由於是指針,因此具備指針的特性;sunFun = sub確定是成立的,有人會說sub不是函數名嗎?那咱們來看看,sub,*sub,&sub的值是同樣的(比較特殊)。再來看看subFun,*subFun,&subFun,前面兩個地址相同,後面一個不一樣,這個也好理解(由於sunFun是指針,指針的地址確定和函數的地址不一樣)。it
*sub是函數名也能夠當指針用,sub的值是函數地址,&sub也是函數的地址;就像(數組,a,和&a[0]的地址同樣,意義不同)。因此subFun和*subFun和sub的值同樣。io
2、typedef函數指針class
typedef int (*FUNADD)(const int value1,const int value2); FUNADD func;
一、typedef就是從新定義了一個別名,typedef函數指針,固然是從新定義了別名,就能用他來定義。gcc
二、FUNADD固然就是一個函數指針了,用它來定義的func就是擁有此功能的函數指針。bug
不知道我說清楚了,語言組織能力一直是個bug。