- 函数会占用一块存储空间,所以函数也有自己的地址
- 函数的地址保存在函数名中,函数名就是函数的地址(数组名就是数组的地址);
函数指针的定义方式
return_Type (*functionP)(arg_type);
* : 表示一个指针;
functionP : 表示指针的变量名称;
(*functionP) : 表示将来指向一个函数;
return_Type : 表示指向的函数返回值类型;
(arg_type) : 表示指向的函数参数类型;
void test()
{
printf("test被执行了\n");
/*
void (*functionP)();
* : 表示一个指针;
functionP : 表示指针的变量名称;
(*functionP) : 表示将来指向一个函数;
void : 表示指向的函数没有返回值;
() : 表示指向的函数没有参数
*/
}
int getAge()
{
return 30;
}
void sum(int v1, int v2)
{
int res = v1 + v2;
printf("res = %i\n", res);
}
int sum2(int v1 , int v2)
{
int res = v1 + v2;
return res;
}
int main(int argc, const char * argv[]) {
printf("test_p = %p\n",test);//0x100003f10
//没有返回值,没有参数
void(*test_P)(void);
//void(*test_P)(void) = test;
test_P = test;
test_P();
//有返回值,没有参数
int (*ageP)();
ageP = getAge;
printf("age = %i\n", ageP());
//有参数,没有返回值
void (*sumP)(int, int);
sumP = sum;
sumP(10, 20);
//有返回值,有参数
int (*sumP2)(int , int);
sumP2 = sum2;
printf("sum = %i\n", sumP2(10, 20));
return 0;
}
函数作为参数
int sum(int v1, int v2)
{
return v1 + v2;
}
int minus(int v1, int v2)
{
return v1 - v2;
}
/// action方法
/// @param v1 V1
/// @param v2 V2
/// @param function 函数指针
int action(int v1,int v2,int(*function)(int,int)) {
int result = function(v1,v2);
return result;
}
int main(int argc, const char * argv[]) {
int(*function_1)(int,int) = sum;
int(*function_2)(int,int) = minus;
// int sum_v = action(10, 20, function_1);
// int minus_v = action(20, 10, function_2);
int sum_v = action(10, 20, sum);
int minus_v = action(20, 10, minus);
printf("sum_v = %d,\nminus_v = %d\n",sum_v,minus_v);
return 0;
}