1、指针函数是函数,函数的返回类型是指针类型。
类型标识符 *函数名(参数列表)
int *f(int,int);
他是一个函数,是一个带返回值地址的。函数的返回值必须是相同类型的指针变量来接收,也就是,指针函数必须是有函数返回值的,而且,函数返回值必须赋值同类型的指针变量。
int* GetDate(int wk, int dy);
int main()
{
int i = 0, j = 0;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d\t", *GetDate(i, j));
}
printf("\n");
}
return 0;
}
int* GetDate(int wk, int dy)
{
int arr[5][7] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
return &arr[wk][dy];
}
运行结果:
函数指针和指针函数的不同,主要区别就是函数名前面的指针*号是没有()起来的,如果()起来的就是函数指针,否则就是指针函数。
函数指针
就是指向函数的指针
函数指针是指向函数的指针变量。每一个函数都要一个入口地址,就和数组名一样指向数组的首地址(第一个元素),函数名也就是指向函数的首地址。
在定义一个函数指针的时候需要按照下面格式:
变量类型名(*函数名)(参数列表)
int (*p)(int a, int b);//函数指针
int Add(int a, int b)//加法函数
{
return a + b;
}
int main()
{
int a=10,b=20,c;
p = Add;//函数指针赋值
c = p(a,b);
}
int add(int a, int b)//和
{
return a + b;
}
int sub(int a, int b)//差
{
return a - b;
}
int mul(int a, int b)//积
{
return a * b;
}
int main()
{
int a = 12, b = 4;
int(*p)(int, int);
p = add;
printf("p(a,b)=%d\n", p(a, b));
p = sub;
printf("p(a,b)=%d\n", p(a, b));
p = mul;
printf("p(a,b)=%d\n", p(a, b));
return 0;
}
运行结果:
函数指针数组
int max(int x, int y)
{
return x > y ? x : y;
}
int min(int x, int y)
{
return x < y ? x : y;
}
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x * y;
}
int mux(int x, int y)
{
return x / y;
}
int main()
{
int(*p[5])(int, int) = { max,min,add,sub,mux };
int num;
num = (*p[3])(10, 20);
printf("%d\n", num);
return 0;
}
4.回调函数
回调函数就是一个通过函数指针调用1函数,如果把函数的地址作为参数传递给另一个函数,当这个函数指针被用来调用其所指向的函数时,我们称这个时回调函数。
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
//定义回调函数
void math(int(*fun)(int x, int y), int s, int t)
{
printf("fun(int,int)=%d\n", fun(s, t));
}
int main()
{
int a = 22, b = 3;
math(add, a, b);
math(sub, a, b);
math(mul, a, b);
return 0;
}
运行结果: