C语言-函数指针和指针函数的用法和区别

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("------------------------------ 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");
	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("------------------------------ 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");
	getchar();
	return 0;
}

执行结果如下:
在这里插入图片描述

4 二者区别

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

4.1 定义不同

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

4.2 写法不同

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

4.3 用法不同

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

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

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
函数指针指针函数是C语言中的两个重要概念,它们虽然涉及到指针函数的结合使用,但实际上表示了不同的含义和用法。 1. 函数指针(Function Pointer)是指可以指向函数指针变量。通过函数指针,我们可以在程序运行时动态地调用不同的函数函数指针的定义和用法如下所示: ```c // 定义函数指针 返回值类型 (*指针变量名)(参数列表); // 使用函数指针调用函数 指针变量名 = 函数名; 指针变量名(参数列表); ``` 例如,我们可以定义一个函数指针变量`p`,指向一个返回类型为`int`、参数列表为`int`的函数,并通过函数指针调用该函数: ```c int add(int a, int b) { return a + b; } int (*p)(int, int); // 定义函数指针变量 p = add; // 指向add函数 int result = p(3, 4); // 调用add函数,返回结果7 ``` 2. 指针函数是指返回指针类型的函数指针函数的定义和用法如下所示: ```c // 定义指针函数 返回值类型 *函数名(参数列表); // 使用指针函数返回指针 返回值类型 *p = 函数名(参数列表); ``` 例如,我们可以定义一个指针函数`getMax`,返回类型为`int*`,参数列表为两个`int`类型的数值,并返回较大的数值的指针: ```c int* getMax(int a, int b) { if (a > b) { return &a; } else { return &b; } } int a = 3, b = 4; int *p = getMax(a, b); // 返回较大的数值的指针 int result = *p; // 获取指针指向的数值,结果为4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值