首页 > 编程知识 正文

c语言函数指针有什么用,c语言有函数指针吗

时间:2023-05-04 13:55:09 阅读:203663 作者:1036

1. 简介

本文主要介绍指针函数和函数指针的定义和区别。

2 指针函数 2.1 定义

指针函数,其本质是一个函数,该函数的返回值是一个指针。
声明格式为:*类型标识符 函数名(参数表)

简单函数声明:

int f(int x,int y);

该函数的返回值是 int 类型。

指针函数声明:

int *f(int x,int y);

该函数为指针函数,其返回值是一个 int 类型的指针,是一个地址。所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

2.2 示例 int *f(int a, int b); // 声明指针函数 int main(){printf("------------------------------ Startn"); 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("------------------------------ Endn");getchar();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;}

通过运行结果,可以看出,指针函数f返回的类型是一个指针类型,因为f是赋值给int类型指针p1的,如果不是指针类型,编译就会出错。
下面是运行结果:

从上图的运行结果可以看出,指针函数f的返回值p和f赋值给的指针p1的地址是相同的,都是指向指针函数内部申请的内存地址0x3b88d0。

3 函数指针 3.1 定义

函数指针,其本质是一个指针变量,该指针指向这个函数。
声明格式:类型说明符 (*函数名) (参数)
如下:

int (*f)(int a, int b); // 声明函数指针

函数指针是需要把一个函数的地址赋值给它,有两种写法:

fun = &Function;fun = Function;

取地址运算符&不是必需的,因为函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

调用函数指针的方式也有两种:

x = (*fun)();x = fun();

两种方式均可,其中第二种看上去和普通的函数调用没啥区别,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。

3.2 示例

下面是利用函数指针分别求两个整数的最大值和最小值的用法。

/* * 求最大值 * 返回值是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 _tmain(int argc, _TCHAR* argv[]){printf("------------------------------ Startn"); 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("------------------------------ Endn");getchar();return 0;}

执行结果如下:

4 二者区别

通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

4.1 定义不同

指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。

4.2 写法不同

指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);

4.3 用法不同

用法不同已经写了详细示例。

总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。