天天看點

函數指針

先上一段代碼:

#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;
}      

結果:

函數指針

經過一段時間的工作,到處都在用函數指針;閑的時候總結下。

一、函數指針

int (*subFun)(const int value1,const int value2);      

1、這個東西一看就是指針對吧,因為帶了括号,是以肯定不是傳回值為指針的函數了;那他就是函數指針了,不知道你明白了嗎。(因為*是和函數先結合的)

2、因為是指針,是以具有指針的特性;sunFun = sub肯定是成立的,有人會說sub不是函數名嗎?那我們來看看,sub,*sub,&sub的值是一樣的(比較特殊)。再來看看subFun,*subFun,&subFun,前面兩個位址相同,後面一個不同,這個也好了解(因為sunFun是指針,指針的位址肯定和函數的位址不同)。

*sub是函數名也可以當指針用,sub的值是函數位址,&sub也是函數的位址;就像(數組,a,和&a[0]的位址一樣,意義不一樣)。是以subFun和*subFun和sub的值一樣。

二、typedef函數指針

typedef int (*FUNADD)(const int value1,const int value2);
FUNADD func;      

1、typedef就是重新定義了一個别名,typedef函數指針,當然是重新定義了别名,就能用他來定義。

2、FUNADD當然就是一個函數指針了,用它來定義的func就是擁有此功能的函數指針。

不知道我說清楚了,語言組織能力一直是個bug。

繼續閱讀