函数指针的概念
如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址称为这个函数的指针。
函数指针是一个指针,不同于一般的指针,一般的指针存放的是一个变量的地址或者一个数组的地址,但是对于函数指针不同,函数指针存放的是一个函数的地址,而函数名便是这个函数的入口,即地址。
具体的函数指针定义的方法如下:
int (*p)(int,int);
上述定义P是一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。
用函数指针变量调用函数
在函数调用当中,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用函数。具体的例子如下图
#include <stdio.h>
int main()
{
int max(int x,int y);
int (*p)(int,int);//定义指向函数的指针变量P
int a,b,c;
p = max;//使得P指向max函数 函数的名称即是函数的入口,即地址
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
c = (*p)(a,b);//通过指针变量回调max函数
printf("a = %d,b = %d,c = %d",a,b,c);
return 0;
}
int max(int x,int y)
{
int z;
if(x>y)
z = x;
else
z = y;
return(z);
}
在这里要注意的一点就是,定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。int (*p)(int,int);表示的是指针变量P只能指向函数返回值为整数且有两个整型参数的变量。
用指向函数的指针作为函数的参数
指向函数的指针变量的一个重要用途就是把函数的地址作为参数传递到其他函数。
具体的用法如下图代码所示:
#include <stdio.h>
int main()
{
int fun(int x,int y,int(*p)(int,int));//第三个形参为函数指针
int max(int,int);//max函数声明
int min(int,int);//min函数声明
int add(int,int);//add函数声明
int a = 31,b = -10,n;
printf("please input 1,2or3");
scanf("%d",&n);
if(n == 1)
fun(a,b,max);//调用max函数,max为函数的入口,也就是函数的地址
if(n == 2)
fun(a,b,min);
if(n == 3)
fun(a,b,add);
return 0;
}
int fun(int x,int y,int(*p)(int,int))
{
int result;
result = (*p)(x,y);
printf("%d\n",result);
return result;
}
int max(int x,int y)
{
int z;
if(x>y)
z = x;
else
z = y;
printf("max = ");
return(z);
}
int min(int x,int y)
{
int z;
if(x>y)
z = y;
else
z = x;
printf("min =");
return(z);
}
int add(int x,int y)
{
int z;
z = x+y;
printf("add =");
return z;
}
指针函数
一个函数可以返回一个整数值,字符值,实型值等,也可以返回指针型的数据,即地址。返回值为指针的函数要注意的一点是:()的优先级要大于*的优先级,因此下面这行代码的意思便是:
int *p(int x,int y);
p后面的()的优先级要大于p前面的*,因此上述代码是先是函数,然后 * 才起作用,因此这个函数的功能是返回一个int型的指针,也就是一个地址。具有上述功能的函数称之为指针函数。
指针函数的使用如下所示。
#include <stdio.h>
int main()
{
int score[][4] = {{60,70,80,90},{56,89,67,88},{34,78,90,60}};//定义数组,存放成绩
int *search(float (*pointer)[4],int n);//函数声明
int *p;
int i,k;
printf("enter the number of student:");
scanf("%d",&k);
printf("The scores of No.%d are:\n",k);
p = search(score,k);
for(i = 0;i<4;i++)
{
printf("%d\t",*(p+i));
}
return 0;
}
int *search(int (*pointer)[4],int n)
{
int *pt;
pt = *(pointer+n);//二维数组*(pointer+n)代表的不是内容,代表的是地址
return pt;
}
函数search定义为指针型函数,它的形参pointer是指向包含4个元素的一维数组的指针变量(用一维数组的性质来理解二维数组),在这里要注意的是下面两句代码的不同:
pt = *(pointer+n);//代表的是第行首个元素的地址
pt = *(pointer)+n;//代表的是第一行的第n个元素的地址