函数指针又叫函数地址,函数名就是地址
#include <stdio.h>
//简单示例,说明如何使用函数指针
int get(int data)
{
return ++data;
}
int main()
{
int (*p)(int data);
p = get;
printf("%d\n",(*p)(12));
return 0;
}
小测验:
#include <stdio.h>
#include <stdlib.h>//使用下面的exit需要包含此头文件
//输入1、2或3,分别对应输出两数最大、最小或和
int getmax(int data1,int data2)
{
int ret;
ret = data1>data2?data1:data2;
return ret;
}
int getmin(int data1,int data2)
{
int ret;
ret = data1<data2?data1:data2;
return ret;
}
int getsum(int data1,int data2)
{
int ret;
ret = data1+data2;
return ret;
}
int chuli(int data1,int data2,int (*p)(int data1,int data2))
/* 注意:上面函数定义可以这样写:
int chuli(int data1,int data2,int (*p)(int ,int ))
因为第三个参数内的data1和data2没有被使用,所以直表示出他的类型即可*/
{
int ret;
ret = (*p)(data1,data2);
return ret;
}
int main()
{
int ret,m;
int (*p)(int data1,int data2);
printf("请输入1、2或3:\n");
scanf("%d",&m);
switch(m)
{
case 1:
p = getmax;
break;
case 2:
p = getmin;
break;
case 3:
p = getsum;
break;
default:
printf("无效输入\n");
exit(-1); //直接退出程序
break;
}
ret = chuli(10,20,p);
printf("%d\n",ret);
return 0;
}
指针数组
#include <stdio.h>
#include <stdlib.h>
//指针数组——>就是一个数组,里面放的都是地址
int getmax(int data1,int data2)
{
int ret;
ret = data1>data2?data1:data2;
return ret;
}
int getmin(int data1,int data2)
{
int ret;
ret = data1<data2?data1:data2;
return ret;
}
int getsum(int data1,int data2)
{
int ret;
ret = data1+data2;
return ret;
}
int chuli(int data1,int data2,int (*p)(int data1,int data2))
{
int ret;
ret = (*p)(data1,data2);
return ret;
}
int main()
{
int ret,m;
int (*p[3])(int data1,int data2) = {getmax,getmin,getsum};
for(int i=0;i<3;i++)
{
ret = (*p[i])(10,20);
printf("ret = %d\n",ret);
}
return 0;
}
指针函数:一个可以返回指针型数据的函数
#include <stdio.h>
//把以下代码理解就差不多了
//输入0 1 2 返回对应行的所有元素
int* getmax(int data,int (*p)[4])
{
int *ret;
ret = (int *)(p+data);
return ret;
}
int main()
{
int arr[3][4]={{2,5,6,4},{4,9,5,7},{3,2,1,5}};
int pos;
int *ppos;
printf("请输入:\n");
scanf("%d",&pos);
ppos = getmax(pos,arr);
for(int i=0;i<4;i++)
{
printf("%d ",*ppos++);
}
return 0;
}
二级指针应用(以上面的程序为例)
#include <stdio.h>
//使用二级指针的方式实现上一个程序
void getmax(int data,int (*p)[4],int **ppos)
{
*ppos = (int *)(p+data);
}
int main()
{
int arr[3][4]={{2,5,6,4},{4,9,5,7},{3,2,1,5}};
int pos;
int *ppos;
printf("请输入:\n");
scanf("%d",&pos);
getmax(pos,arr,&ppos);
for(int i=0;i<4;i++)
{
printf("%d ",*ppos++);
}
return 0;
}
|