问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样用函数指针做参数?

发布网友 发布时间:2022-04-19 14:29

我来回答

5个回答

热心网友 时间:2023-07-31 05:34

函数的指针可以作为一个参数传递给另外一个函数,这一点非常有意思。一个函数用函数指针作参数,意味着这个函数的一部分工作需要通过函数指针调用另外的函数来完成,这被称为“回调(callback)”。处理图形用户接口的许多C库函数都用函数指针作参数,因为创建显示风格的工作可以由这些函数本身完成,但确定显示内容的工作需要由应用程序完成。
举一个简单的例子,假设有一个由字符指针组成的数组,你想按这些指针指向的字符串的值对这些指针进行排序,你可以使用qsort()函数,而qsort()函数需要借助函数指针来完成这项任务(关于排序的详细介绍请参见第3章“排序和查找”。qsort()函数有4个参数:
(1) 指向数组开头的指针;
(2) 数组中的元素数目;
(3) 数组中每个元素的大小;
(4) 指向一个比较函数的指针。
qsort()函数返回一个整型值。
比较函数有两个参数,分别为指向要比较的两个元素的指针。当要比较的第一个元素大于、等于或小于第二个元素时,比较函数分别返回一个大于o,等于。或小于。的值。
排序算法和交换算法都是qsort()函数的部分内容。qsort()函数的交换算法代码只负责拷贝指定数目的字节(可能调用memcpy()或memmove()函数),因此qsort()函数不知道要对什么样的数据进行排序,也就不知道如何比较这些数据。比较数据的工作将由函数指针所指向的比较函数来完成。
对本例来说,不能直接用strcmp()函数作比较函数,其原因有两点:第一,strcmp()函数的类型与本例不符(见下文中的介绍);第二,srtcmp()函数不能直接对本例起作用。strcmp()函数的两个参数都是字符指针,它们都被strcmp()函数看作是字符串中的第一个字符;本例要处理的是字符指针(char *s),因此比较函数的两个参数必须都是指向字符指针的指针。
为什么不能直接将strcmp()函数传递给qsort()函数呢?为什么strpcmp()函数中的参数是如此一种形式呢?因为函数指针的类型是由它所指向的函数的返回值类型及其参数的数目和类型共同决定的,而qsort()函数要求比较函数含两个const void *类型的参数:
qsort()函数不知道要对什么样的数据进行排序,因此,base参数和比较函数中的两个参数都是void指针。这一点很容易理解,因为任何指针都能被转换成void指针,并且不需要强制转换。但是,qsort()函数对函数指针参数的类型要求就苛刻一些了。本例要排序的是一个字符指针数组,尽管strcmp()函数的比较算法与此相符,但其参数的类型与此不符,所以在本例中strcmp()函数不能直接被传给qsort()函数。在这种情况下,最简单和最安全的方法是将一个参数类型符合qsort()函数的要求的比较函数传给qsort()函数,而将比较函数的参数强制转换成strcmp()函数所要求的类型后再传给strcmp()函数;strpcmp()函数的作用正是如此。
不管是强制转换strpcmp()函数的参数的类型,还是强制转换指向strcmp()函数的指针的类型,你都必须小心进行,因为稍有疏忽,就会使程序出错。在实际编程中,转换函数指针的类型更容易使程序出错。

热心网友 时间:2023-07-31 05:34

#include <stdio.h>
void func_callback(int *arg)
{
*arg = 54;
}
int func(int a, void (*callback)(int *))
{
int b;
callback(&b);
return b + a;
}
int main()
{
int c =func(34,func_callback);
printf("%d\n",c);
return 0;
}
func是一个返回int类型的函数,它的参数callback是函数指针。
函数指针作参数时,函数指针的参数只有类型,这里是一个指向int类型的指针

热心网友 时间:2023-07-31 05:35

int fun(int* a,int* b)
这样就是用指针做参数。

热心网友 时间:2023-07-31 05:35

列了几个简单的应用:

//形式1:返回类型(*函数名)(参数表)
#include<cstdio>
char (*pFun)(int);

char glFun(int a){printf("just a test,hehe\n"); return 'a';}

void main()

{

pFun = glFun;

(*pFun)(2);

}

//形式2:typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}

//形式三
#include<iostream>
using namespace std;
class CA
{
public:
char lcFun(int a){cout<<"just a test "<<a<<endl; return 'a'; }
};

typedef char (CA::*PTRFUN)(int);

int main()
{
CA ca;
PTRFUN pFun;
pFun=&CA::lcFun;
//ca.lcFun(2);
(ca.*pFun)(2);
return 0;
}

热心网友 时间:2023-07-31 05:36

排序有很多算法的,最简单的一个
冒泡法:
void BubbleSort(int* pData,int Count)
{
int iTemp;
for(int i=1;i<Count;i++)
{
for(int j=Count-1;j>=i;j--)
{
if(pData[j]<pData[j-1])
{
iTemp = pData[j-1];
pData[j-1] = pData[j];
pData[j] = iTemp;
}
}
}
}
稍微改一下就行了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 函数指针? 如何通过函数指针调用函数 c语言函数指针怎么用啊?尤其是main函数 如何定义一个函数指针? 请问这个函数指针怎么理解? 函数指针(指向函数的指针) 如何使用? 它和回调... c++的函数指针是怎么用的呀? 函数指针怎么用?? 函数指针如何定义 如何定义指向函数的指针? 函数指针怎么调用 C语言函数指针怎么用? SPACE键是什么? 发早上好会占对方很大内存吗?? 怎样调皮的说早上好 韩语早上好怎么说 网上说微信发早上好图片会占对方大内存吗? 广东话早上好怎么说 早上好图片占空间大吗? 微信问候语早上好图片是站内存太大吗?发早上好图... 函数指针怎么理解*******调用 如何使用函数指针指向几个函数 如何定义一个指向任何函数的函数指针 函数指针是什么?_? 通易付打电话问还用吗,不用的话给注销是真的假的? 通易付plus如何注销 通易付plus里的个人信息怎么注销? 通易付实名认证中为什么要认证信用卡,但信用卡却... 通易付plus骗局通易付为什么刷卡扣了199的服务费?... 通易付pos机注册需要上传身份证和银行卡吗?提供这... 通易付安全吗? 通易付被装机人盗刷不用了会被扣钱吗? 通易付POS机是支付宝免押金领取吗? 通易付plus pos机是正规的吗? 通易付不用了要不要收年费 通易付刷支付宝匹配商户失败 通易付账号关闭怎么回事?不让提现了! 不是所有的通易付都是骗子,都被不良商家搞坏了? 通易付pos机,刚买回来,还没用,因为好奇拆开了,... 通易付刷卡显示付款成功,收钱卡是注销了的银行卡,...