指针函数和函数指针
指针函数和函数指针
指针函数
定义
指针函数,简单的来说,就是一个返回值为指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式:类型标识符 *函数名(参数列表)
首先先看一个普通的函数声明:
int fun(int x,int y)
上面就是声明了一个名称为fun
的函数,该函数的返回值是int
类型,有两个int
类型的参数。
再看下面这个函数声明:
int *fun(int x,int y)
这和上面那个函数声明唯一的区别就是在函数名前面多了一个\(*\)号,而这个\(*\)号的出现,导致该函数成为了一个指针函数。对其的理解是:声明了一个名称为fun
的指针函数,其返回值是一个int
类型的指针,有两个int
类型的参数。
如果写成下面这种\(*\)号与int
紧贴在一起,与函数名隔开的形式,看起来就明了很多。
int* fun(int x,int y)
这样说来,指针函数没有什么特别的,和普通的函数相比,不过是一个返回的是具体的类型,一个返回的是某种类型的指针(即地址值)。
示例
#include<stdio.h>
int *f(int x, int y); // 声明指针函数
int main(void)
{
printf("------------------------------ Start\n");
int *p1 = NULL;
printf("The memeory address of p1 = 0x%x \n", p1);
p1 = f(1, 2);
printf("The memeory address of p1 = 0x%x \n", p1);
printf("*p1 = %d \n", *p1);
printf("------------------------------ End\n");
return 0;
}
/*
* 指针函数的定义
* 返回值的指针类型为int
*/
int *f(int a, int b) {
int *p = (int *)malloc(sizeof(int));
printf("The memeory address of p = 0x%x \n", p);
memset(p, 0, sizeof(int));
*p = a + b;
printf("*p = %d \n", *p);
return p;
}
函数指针
定义
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型表示符 (*函数名)(参数列表)
注意:与指针函数的区别就在于\(*\)号是否与函数名用括号括起来
如下:
int (*fun)(int x,int y)
函数指针是需要将一个函数的地址赋值或者传给它,有两种写法:
fun = &Function;
fun = Function;
取地址运算符不是必修的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
两种方式均可,但是更建议使用第一种,因为第一种可以清楚的指明这是通过指针的方式来调用函数。
示例
#include<stdio.h>
/*
* 求最大值
* 返回值是int类型,返回两个整数中较大的一个
*/
int max(int a, int b) {
return a > b ? a : b;
}
/*
* 求最小值
* 返回值是int类型,返回两个整数中较小的一个
*/
int min(int a, int b) {
return a < b ? a : b;
}
int (*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数
int main(void)
{
printf("------------------------------ Start\n");
f = max; // 函数指针f指向求最大值的函数max
int c = (*f)(1, 2);
printf("The max value is %d \n", c);
f = min; // 函数指针f指向求最小值的函数min
c = (*f)(1, 2);
printf("The min value is %d \n", c);
printf("------------------------------ End\n");
return 0;
}
二者区别
定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
写法不同
指针函数:int* fun(int x,int y)
函数指针:int (*fun)(int x,int y)