前言
当学习数组指针与指针数组的时候很是让人头疼,到底是数组还是指针?深入学习到函数的时候发现既然有函数指针与指针函数这么个更让人头疼的难以区分的问题。当去看一眼定义的时候,噼里啪啦一串又长又绕,真让人崩溃!好不容易记住了结果没过几天就又忘记了,那么今天你看的这篇文章就能理解并区别两者。
函数指针
定义
简单的来说,其本质是一个指针,而该指针指向一个函数。总结来说就是:指向函数的指针
函数指针的声明
int (*fun)(int x,int y);
//该函数指针fun是一个指向返回值为整型,有两个参数并且两个参数的类型都是整型的函数
当然函数指针其本质既然是一个指针,那么赋值自然要把一个函数的地址赋值给它,有两种写法:
fun = &max;
fun = max;
很多小伙伴想这为什么不加取地址符(&)也可以?其实是每个函数的函数名就是该函数的入口地址
实例说明
//求两个整数的较大值和较小值
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int (*fun)(int m, int n);//声明一个函数指针,该指针指向返回值为int型,有两个参数都是int的函数
int main()
{
int e,f;
printf("请输入两个数:");
scanf("%d %d",&e,&f);
fun = &max;//函数指针指向较大值函数max
int c = (*fun)(e, f);
printf("较大的数值是: %d \n", c);
fun = min;
c = fun(e, f);//函数指针指向较小值min
printf("较小的数值是: %d \n", c);
return 0;
}
运行结果如下:
这里值得注意的是将一个函数赋值给函数指针时可以不加取地址符(&),同时调用函数指针也有两种不同的方式:
c = fun(e, f);
c = (*fun)(e, f);
指针函数
定义
简单的来讲就是一个返回值是一个指针的函数,其本质是一个函数,而该函数的返回值是一个指针
指针函数的声明
int *fun(int a, int b); // 返回值为int *,指针类型的返回值
当然上述声明也可以写成以下形式:
int* f(int a, int b);
让指针标志 * 与int紧贴在一起,而与函数名fun间隔开,这样看起来就明了些了,fun是函数名,返回值类型是一个int类型的指针。指针函数就是返回一个地址给调用者。
实例说明:
#include <stdio.h>
#include <stdlib.h>
int* fun(int a,int b)//声明一个指针函数
{
int *p = (int *)malloc(sizeof(int));
printf("P的地址为:0x%x \n", p);
if(a>b)
*p=a;
else
*p=b;
printf("*p = %d \n", *p);
return p;
}
int main()
{
int m,n,*q;
printf("q的地址为:0x%x\n",q);
printf("请输入两个数:");
scanf("%d %d",&m,&n);
q=fun(m,n);//调用函数指针,得到较大值的地址
printf("q的地址为:0x%x\n",q);
printf("较大值是:%d",*q);
return 0;
}
运行结果如下:
通过函数指针得到一个指向较大值的指针,也就是地址。将该地址给调用者(q),最终得到较大值。
两者区别总结
类别 | 主体 | 作用 | 定义 |
---|---|---|---|
指针函数 | 函数 | 返回一个指针 | int* fun(int x,int y) |
函数指针 | 指针 | 指向一个函数 | int (*fun)(int x,int y); |
或许记住会比较麻烦,可以这样记。括号的优先级高于星号(*),当括号里有星号时就是一个函数指针,没有则是一个指针函数,或者名字谁在后就是谁的本体(指针函数的本体是函数)当然想要深入了解还是得自己实践自己总结!
最后如果文章对你有帮助,请送我一个免费的赞呗!