首页

文章

怎样用函数指针做参数?

发布网友 发布时间: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;
}
}
}
}
稍微改一下就行了
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 函数指针? 如何通过函数指针调用函数 c语言函数指针怎么用啊?尤其是main函数 如何定义一个函数指针? 请问这个函数指针怎么理解? 函数指针(指向函数的指针) 如何使用? 它和回调... c++的函数指针是怎么用的呀? 函数指针怎么用?? 函数指针如何定义 如何定义指向函数的指针? 函数指针怎么调用 C语言函数指针怎么用? SPACE键是什么? 发早上好会占对方很大内存吗?? 怎样调皮的说早上好 韩语早上好怎么说 网上说微信发早上好图片会占对方大内存吗? 广东话早上好怎么说 早上好图片占空间大吗? 微信问候语早上好图片是站内存太大吗?发早上好图... 函数指针怎么理解*******调用 如何使用函数指针指向几个函数 如何定义一个指向任何函数的函数指针 函数指针是什么?_? 通易付打电话问还用吗,不用的话给注销是真的假的? 通易付plus如何注销 通易付plus里的个人信息怎么注销? 通易付实名认证中为什么要认证信用卡,但信用卡却... 通易付plus骗局通易付为什么刷卡扣了199的服务费?... 通易付pos机注册需要上传身份证和银行卡吗?提供这... 通易付安全吗? 通易付被装机人盗刷不用了会被扣钱吗? 通易付POS机是支付宝免押金领取吗? 通易付plus pos机是正规的吗? 通易付不用了要不要收年费 通易付刷支付宝匹配商户失败 通易付账号关闭怎么回事?不让提现了! 不是所有的通易付都是骗子,都被不良商家搞坏了? 通易付pos机,刚买回来,还没用,因为好奇拆开了,... 通易付刷卡显示付款成功,收钱卡是注销了的银行卡,...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com