指针函数与指向函数的指针的区别

(一)指针函数

1. 指针函数:返回值数据类型为指针的函数

2. 格式 :类型说明符 * 函数名(参数列表)

     eg:  int * add (int,int)

3.用途:一般用于动态内存分配和数据传输

(二)指向函数的指针

1.指向函数的指针:顾名思义,一个指向函数的指针

2.格式:类型说明符 (*指针变量名)(参数列表)

              eg: int (*p)(int ,int);

                    p=add;//此处add是函数名

3.用途:一般用于回调函数和函数指针数组

(三)两者在实际应用中的区别

为了使读者清晰地了解两者的区别,我们采用以上两种方式解决同一个问题:

Question: 编写函数实现求两个整数的最大值,返回其地址

// 注意此处作者为了方便,并没有讨论当两个整数相同时的情况。

3.1:指针函数实现

法一:

#include <stdio.h>
int * MAX2(int* pa,int* pb)
{
	if(*pa>*pb)
		return pa;
	return pb;	
}
int main()
{
	int a,b;
	int* max;
	
	printf("请输入两个整数(用空格间隔):\n");
	scanf("%d%d",&a,&b);
	
	int* pa=&a;
	int* pb=&b;
	max=MAX2(pa,pb);
	
	printf("两者中的较大值为:%d",*max);
	
	return 0;
}

法二:

#include <stdio.h>
#include <stdlib.h>
int * MAX2(int a,int b)
{
   int *p=((int*)malloc(sizeof(int)));
   p=&(a>b?a:b);
	return p;	
}
int main()
{
	int a,b;
	int* max;
	
	printf("请输入两个整数(用空格间隔):\n");
	scanf("%d%d",&a,&b);
	max=MAX2(a,b);
	
	printf("两者中的较大值为:%d",*max);
	
	return 0;
}

运行结果为:

解说:(此处只解说法一)

1.用户从界面输入a,b,我们采用数据类型为int*的pa,pb分别接收 a,b的地址

2.此时采用 max=MAX2(pa,pb); 表达式调用,使得子函数返回两者中较大值的地址,用于主函数的应用

3.int * MAX2(int* pa,int* pb) 子函数采用指针函数来明确返回值是一个地址,用int *类型的形参来接受a,b  的地址

3.2:指向函数的指针实现

法一:

#include <stdio.h>
#include <stdlib.h>
int* MAX2(int a,int b)
{
    int *s=((int *)malloc(sizeof(int)));
    
    if(a>b)	*s=a;
	else	*s=b;
	
	return s;
}
int main()
{
	int a,b;

	printf("请输入两个整数(用空格间隔):\n");
	scanf("%d%d",&a,&b);
	
	int* (*p)(int,int);
	p=MAX2;
    int *max=(*p)(a,b);
	
	printf("两者中的较大值为:%d",*max);
	
	free(max);
	return 0;
}

法二:

#include <stdio.h>

int* MAX2(int a,int b)
{
    static int s;
    if(a>b)	s=a;
	else	s=b;
	
	return &s;
}
int main()
{
	int a,b;

	printf("请输入两个整数(用空格间隔):\n");
	scanf("%d%d",&a,&b);
	
	int* (*p)(int,int);
	p=MAX2;
    int *max=(*p)(a,b);
	
	printf("两者中的较大值为:%d",*max);

	return 0;
}

运行结果为:

解说:(此处只解说法一)

1.用户输入两个整数a,b

2.声明一个指向函数的指针p,(int,int)表明主函数向这个子函数传递两个数据类型为int 的数据,前面的int *表明返回值是一个指针

3.将函数的地址给p,方便后面的调用

4.调用函数

5.free(max) 防止内存泄漏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值