(一)指针函数
1. 指针函数:返回值数据类型为指针的函数
2. 格式 :类型说明符 * 函数名(参数列表)
eg: int * add (int,int)
3.用途:一般用于动态内存分配和数据传输
(二)指向函数的指针
1.指向函数的指针:顾名思义,一个指向函数的指针
2.格式:类型说明符 (*指针变量名)(参数列表)
eg: int (*p)(int ,int);
p=add;//此处add是函数名
3.用途:一般用于回调函数和函数指针数组
(三)两者在实际应用中的区别
为了使读者清晰地了解两者的区别,我们采用以上两种方式解决同一个问题:
Question: 编写函数实现求两个整数的最大值,返回其地址
// 注意此处作者为了方便,并没有讨论当两个整数相同时的情况。
3.1:指针函数实现
法一:
#include <stdio.h>
int * MAX2(int* pa,int* pb)
{
if(*pa>*pb)
return pa;
return pb;
}
int main()
{
int a,b;
int* max;
printf("请输入两个整数(用空格间隔):\n");
scanf("%d%d",&a,&b);
int* pa=&a;
int* pb=&b;
max=MAX2(pa,pb);
printf("两者中的较大值为:%d",*max);
return 0;
}
法二:
#include <stdio.h>
#include <stdlib.h>
int * MAX2(int a,int b)
{
int *p=((int*)malloc(sizeof(int)));
p=&(a>b?a:b);
return p;
}
int main()
{
int a,b;
int* max;
printf("请输入两个整数(用空格间隔):\n");
scanf("%d%d",&a,&b);
max=MAX2(a,b);
printf("两者中的较大值为:%d",*max);
return 0;
}
运行结果为:
解说:(此处只解说法一)
1.用户从界面输入a,b,我们采用数据类型为int*的pa,pb分别接收 a,b的地址
2.此时采用 max=MAX2(pa,pb); 表达式调用,使得子函数返回两者中较大值的地址,用于主函数的应用
3.int * MAX2(int* pa,int* pb) 子函数采用指针函数来明确返回值是一个地址,用int *类型的形参来接受a,b 的地址
3.2:指向函数的指针实现
法一:
#include <stdio.h>
#include <stdlib.h>
int* MAX2(int a,int b)
{
int *s=((int *)malloc(sizeof(int)));
if(a>b) *s=a;
else *s=b;
return s;
}
int main()
{
int a,b;
printf("请输入两个整数(用空格间隔):\n");
scanf("%d%d",&a,&b);
int* (*p)(int,int);
p=MAX2;
int *max=(*p)(a,b);
printf("两者中的较大值为:%d",*max);
free(max);
return 0;
}
法二:
#include <stdio.h>
int* MAX2(int a,int b)
{
static int s;
if(a>b) s=a;
else s=b;
return &s;
}
int main()
{
int a,b;
printf("请输入两个整数(用空格间隔):\n");
scanf("%d%d",&a,&b);
int* (*p)(int,int);
p=MAX2;
int *max=(*p)(a,b);
printf("两者中的较大值为:%d",*max);
return 0;
}
运行结果为:
解说:(此处只解说法一)
1.用户输入两个整数a,b
2.声明一个指向函数的指针p,(int,int)表明主函数向这个子函数传递两个数据类型为int 的数据,前面的int *表明返回值是一个指针
3.将函数的地址给p,方便后面的调用
4.调用函数
5.free(max) 防止内存泄漏