前言
关于指针数组,数组指针的解释:C语言:指针数组和数组指针的理解
正文
定义
// 正常函数
int fun(int x, int y);
// 指针函数
int *fun(int x, int y);
// 函数指针
int (*fun)(int x, int y);
** 指针函数本质是一个函数,其返回值为指针。**
** 函数指针本质是一个指针,其指向一个函数。**
-
正常函数:函数名为
fun
,两个形参为(int x, int y)
,返回值为int
整形。
声明格式:类型标识符 函数名(参数)
-
指针函数:就是一个返回指针的函数,其本质还是一个函数,而该函数的返回值是一个指针。
声明格式:类型标识符 *函数名(参数)
-
函数指针:本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名)(参数)
指针函数
概念:
指针函数:相较于正常函数,在函数前面多了个 *
号,但是这个 *
会和int
组成 int *
( int 类型的指针,是个地址)的返回值,和正常函数相比,不过是返回值是个指针。
写法:
int *fun(int x, int y);
int * fun(int x, int y);
int* fun(int x, int y);
三种写法都是一样的,不过如果 *
靠近返回值类型会比较好理解,推荐第三种写法。
示例:
#include <stdio.h>
#include <stdlib.h>
int sum = 0;
int Max(int x, int y)
{
return (x>y?x:y);
}
//指针函数
int* P_Add(int x, int y)
{
sum = x + y;
return ∑
}
int main()
{
int *pTemp, Temp;
pTemp = P_Add(100,50);
printf("Add Result: %d\n", *pTemp);
Temp = Max(100,50);
printf("Max Value: %d\n", Temp);
return 0;
}
函数指针
概念:
函数指针:相比较于指针函数,把 *
和 函数名括一起,一种特殊的指针,指向函数的入口
使用:
函数指针需要把一个函数的地址赋给它。
int (*fun)(int x, int y);
fun = Function;
如果是函数调用,使用如下:
x = (*fun)();
x = fun();
示例:
#include <stdio.h>
#include <stdlib.h>
/*
* 定义一个函数指针p,只能指向返回值为int,形参为两个int 的函数
*/
int (*p)(int,int);
int Max(int x, int y)
{
return (x>y?x:y);
}
int Min(int x, int y)
{
return (x<y?x:y);
}
int main()
{
int Num1 = 100, Num2 = 50;
p = Max;
printf("Max Value: %d\n", p(Num1, Num2));
p = Min;
printf("Min Value: %d\n", p(Num1, Num2));
return 0;
}
问题
我写完我在想,直接函数名调用和函数指针调用的区别,然后找到了如下答案:
- 直接用函数名调用除了可读性好一点外,没有多少优势,如果你想写一个通用一点的方法来处理不同的函数,则调用不同函数的地方需要多次类似重复地使用不同的函数去调用
- 使用函数指针就可以避免这个问题,不管是普通调用或者是形参,只要参数类型和返回值一致即可,不必重复使用函数名,尤其是函数指针数组更是使用得广泛