能够外出吹风吗,支原体肺炎病毒肺炎

> c语言中用一个函数指针作为另一个函数的参数,该怎么解决
c语言中用一个函数指针作为另一个函数的参数,该怎么解决
jjkk110 & &
发布时间: & &
浏览:16 & &
回复:2 & &
悬赏:0.0希赛币
c语言中用一个函数指针作为另一个函数的参数#include&stdio.h&void main(){ int max(int x,int y); int min(int x,int y); int method(int *p,int x,int y); int a,b,c; scanf(&%d%d&,a,b); int (*p)(int x,int y); p = int (*q)(int x,int y); q = c = method(max,a,b); printf(&%d&,c);}int method(int *p,int x,int y){ (*p)(x,y);}int max(int x,int y){
z = } else {
z = } return (z);}int min(int x,int y){
z = } else {
z = } return (z);}错在哪里,麻烦大家给指出来,或者是根本就没有这种用法啊???
#include&stdio.h&void main(){ int max(int x,int y); int min(int x,int y); int method(int (*p)(int,int),int x,int y); int (*p)(int x,int y); int (*q)(int x,int y);
int a,b,c; p=
q= scanf(&%d%d&,&a,&b); c = method(max,a,b); printf(&%d&,c);}int method(int (*p)(int,int),int x,int y){
z=(*p)(x,y); return (z);}int max(int x,int y){
z = } else {
z = }return (z);}int min(int x,int y){
z = } else {
z = } return (z);}这样改一下就行了。
jjl2050 & &
09:02:02 & &
& & (3)(1)引用
楼上的是正确的答案。楼主的int method(int *p,int x,int y)中p只是一个int型的指针,而不是一个函数指针。在方法中*p当然也就是个int型的值,所以那样调用就出问题了。int method(int (*p)(int,int),int x,int y)中的p才是一个函数指针,它指向的函数有两个int型参数并且返回一个int类型的值。也可以这样,先定义一个函数指针,如pfunc,指向有两个int型参数并且返回一个int类型的值的函数typedef int (*pfunc)(int,int);//然后直接用pfunc来作变量类型int method(pfunc p,int x,int y){}qigyczxx & &
09:02:02 & &
& & (1)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&C语言技巧—怎样用指向函数的指针作函数的参数?_C语言中文网
&&/&&&&/&&&&/&&
函数的指针可以作为一个参数传递给另外一个函数,这一点非常有意思。一个函数用函数指针作参数,意味着这个函数的一部分工作需要通过函数指针调用另外的函数来完成,这被称为&回调(callback)&。处理图形用户接口的许多C库函数都用函数指针作参数,因为创建显示风格的工作可以由这些函数本身完成,但确定显示内容的工作需要由应用程序完成。
举一个简单的例子,假设有一个由字符指针组成的数组,你想按这些指针指向的字符串的值对这些指针进行排序,你可以使用qsort()函数,而qsort()函数需要借助函数指针来完成这项任务(关于排序的详细介绍请参见第3章&排序和查找&。qsort()函数有4个参数:&&&&
&&& (1) 指向数组开头的指针;
&&& (2) 数组中的元素数目;
&&& (3) 数组中每个元素的大小;
&&& (4) 指向一个比较函数的指针。&&&
qsort()函数返回一个整型值。
比较函数有两个参数,分别为指向要比较的两个元素的指针。当要比较的第一个元素大于、等于或小于第二个元素时,比较函数分别返回一个大于o,等于。或小于。的值。一个比较两个整型值的函数可能如下所示:
&&& int icmp(const int& *p1,const int& *p2)&&&
&&&&&&& return *p1-*p2;
排序算法和交换算法都是qsort()函数的部分内容。qsort()函数的交换算法代码只负责拷贝指定数目的字节(可能调用memcpy()或memmove()函数),因此qsort()函数不知道要对什么样的数据进行排序,也就不知道如何比较这些数据。比较数据的工作将由函数指针所指向的比较函数来完成。
对本例来说,不能直接用strcmp()函数作比较函数,其原因有两点:第一,strcmp()函数的类型与本例不符(见下文中的介绍);第二,srtcmp()函数不能直接对本例起作用。strcmp()函数的两个参数都是字符指针,它们都被strcmp()函数看作是字符串中的第一个字符;本例要处理的是字符指针(char *s),因此比较函数的两个参数必须都是指向字符指针的指针。本例最好使用下面这样的比较函数;
&&& int strpcmp(const void *p1,const void *p2)
&&&&&&& char& * const& *sp1& =& (char& *& const& *)p1;
&&&&&&& char'const *sp2=(char *const *)p2;
&&&&&&& return strcmp(*sp1,*sp2);
本例对qsort()函数的调用可以如下所示:
&&& qsort(array,numElements,sizeof(char *),pf2);
这样,每当qsort()函数需要比较两个字符指针时,它就可以调用strpcmp()函数了。
为什么不能直接将strcmp()函数传递给qsort()函数呢?为什么strpcmp()函数中的参数是如此一种形式呢?因为函数指针的类型是由它所指向的函数的返回值类型及其参数的数目和类型共同决定的,而qsort()函数要求比较函数含两个const void *类型的参数:
&& void qsort(void *base,
&&& size_t numElernents,
&&& size_t sizeOfElement,
&&& int(*compFunct)(const void *,const void *));&&&
qsort()函数不知道要对什么样的数据进行排序,因此,base参数和比较函数中的两个参数都是void指针。这一点很容易理解,因为任何指针都能被转换成void指针,并且不需要强制转换。但是,qsort()函数对函数指针参数的类型要求就苛刻一些了。本例要排序的是一个字符指针数组,尽管strcmp()函数的比较算法与此相符,但其参数的类型与此不符,所以在本例中strcmp()函数不能直接被传给qsort()函数。在这种情况下,最简单和最安全的方法是将一个参数类型符合qsort()函数的要求的比较函数传给qsort()函数,而将比较函数的参数强制转换成strcmp()函数所要求的类型后再传给strcmp()函数;strpcmp()函数的作用正是如此。
不论C程序在什么样的环境中运行,char *类型和void。类型之间都能进行等价的转换,因此,你可以通过强制转换函数指针类型使qsort()函数中的函数指针参数指向strcmp()函数,而不必另外定义一个strpcmp()这样的函数,例如:
&&& char&&& table[NUM_ELEMENTS][LEMENT_SIZE);
&&& /*& ...& */
&&& /*& passing strcmp() to qsort for array Of array Of char& */
&&& qsort(table,NUM_ELEMENTS,ELEMENT_SIZE,
&&& (int(*)(const void *,const void *))strcmp);
不管是强制转换strpcmp()函数的参数的类型,还是强制转换指向strcmp()函数的指针的类型,你都必须小心进行,因为稍有疏忽,就会使程序出错。在实际编程中,转换函数指针的类型更容易使程序出错。
推荐文章 TOP102015年1月 C/C++大版内专家分月排行榜第二2012年3月 C/C++大版内专家分月排行榜第二2011年11月 C/C++大版内专家分月排行榜第二2010年6月 C/C++大版内专家分月排行榜第二2010年5月 C/C++大版内专家分月排行榜第二
2011年4月 C/C++大版内专家分月排行榜第三2011年2月 C/C++大版内专家分月排行榜第三2010年8月 C/C++大版内专家分月排行榜第三
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
2013年3月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。C:返回值为指针的函数解读
一、先看看下面的小程序:
[cpp] #include &stdio.h&&&
#include &stdlib.h&&&
typedef struct _STSTAFFINFO&
&&& char *pN /*姓名*/&&
&&& int iId;&&&& /*ID*/&&&
}stStaffI&
/*根据ID获取姓名*/&
char* GetStaffNameById(int iId)&
&&& stStaffInfo stTmpInfo[] =&&
&&&&&&& {&Socrates&, 1},&
&&&&&&& {&dyx1024&, 2},&
&&&&&&& {&Kevin&, 3},&
&&&&&&& {&Jim&, 4}&
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)&
&&&&&&& if (stTmpInfo[i].iId == iId)&
&&&&&&& {&
&&&&&&&&&& return stTmpInfo[i].pN&
&&&&&&& }&
&&& return &No match Name&;&&&&&
&&&&&&&&&&&&&&&
int main(int argc, char *argv[])&
& int iId = 2;&&
& char *pName = GetStaffNameById(iId);&
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);&
& system(&PAUSE&);&&&
& return 0;&
#include &stdio.h&
#include &stdlib.h&
typedef struct _STSTAFFINFO
&&& char *pN /*姓名*/
&&& int iId;&&&& /*ID*/&
/*根据ID获取姓名*/
char* GetStaffNameById(int iId)
&&& stStaffInfo stTmpInfo[] =
&&&&&&& {&Socrates&, 1},
&&&&&&& {&dyx1024&, 2},
&&&&&&& {&Kevin&, 3},
&&&&&&& {&Jim&, 4}
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)
&&&&&&& if (stTmpInfo[i].iId == iId)
&&&&&&&&&& return stTmpInfo[i].pN
&&& return &No match Name&;&&&
&&&&&&&&&&&&&
int main(int argc, char *argv[])
& int iId = 2;
& char *pName = GetStaffNameById(iId);
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);
& system(&PAUSE&);&
& return 0;
运行结果:
Staff Name is : dyx1024(id = 2)&
请按任意键继续. . .&
Staff Name is : dyx1024(id = 2)
请按任意键继续. . .
& 运行结果与预期相符,但此程序却是一个有问题的程序,stTmpInfo是一个定义在函数GetStaffNameById中的临时变量,调用完此程序,它即被销毁,所以main函数中,pName所指对象的值是不确定的,在没被覆盖前,正确( 像此程序),但若被其他的函数调用覆盖,谁也不知道其值是什么。
二、如何改进?
& 方法有以下四种,推荐使用方法三。
& 1、将stTmpInfo定义为全局变量,如下
#include &stdio.h&&&
#include &stdlib.h&&&
typedef struct _STSTAFFINFO&
&&& char *pN /*姓名*/&&
&&& int iId;&&&& /*ID*/&&&
}stStaffI&
static stStaffInfo stTmpInfo[] =&&
&&&&&&& {&Socrates&, 1},&
&&&&&&& {&dyx1024&, 2},&
&&&&&&& {&Kevin&, 3},&
&&&&&&& {&Jim&, 4}&
/*根据ID获取姓名*/&
char* GetStaffNameById(int iId)&
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)&
&&&&&&& if (stTmpInfo[i].iId == iId)&
&&&&&&& {&
&&&&&&&&&& return stTmpInfo[i].pN&
&&&&&&& }&
&&& return &No match Name&;&&&&&
&&&&&&&&&&&&&&&
int main(int argc, char *argv[])&
& int iId = 2;&&
& char *pName = GetStaffNameById(iId);&
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);&
& system(&PAUSE&);&span style=&white-space:pre&& &/span&&
& return 0;&
#include &stdio.h&
#include &stdlib.h&
typedef struct _STSTAFFINFO
&&& char *pN /*姓名*/
&&& int iId;&&&& /*ID*/&
static stStaffInfo stTmpInfo[] =
&&&&&&& {&Socrates&, 1},
&&&&&&& {&dyx1024&, 2},
&&&&&&& {&Kevin&, 3},
&&&&&&& {&Jim&, 4}
/*根据ID获取姓名*/
char* GetStaffNameById(int iId)
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)
&&&&&&& if (stTmpInfo[i].iId == iId)
&&&&&&&&&& return stTmpInfo[i].pN
&&& return &No match Name&;&&&
&&&&&&&&&&&&&
int main(int argc, char *argv[])
& int iId = 2;
& char *pName = GetStaffNameById(iId);
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);
& system(&PAUSE&);&span style=&white-space:pre&&&&/span&
& return 0;
2、程序内部将stTmpInfo定义为static,如下:
#include &stdio.h&&&
#include &stdlib.h&&&
typedef struct _STSTAFFINFO&
&&& char *pN&&
&&& int iId;&&&& /*ID*/&&&
}stStaffI&
char* GetStaffNameById(int iId)&
&&& static stStaffInfo stTmpInfo[] =&&
&&&&&&& {&Socrates&, 1},&
&&&&&&& {&dyx1024&, 2},&
&&&&&&& {&Kevin&, 3},&
&&&&&&& {&Jim&, 4}&
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)&
&&&&&&& if (stTmpInfo[i].iId == iId)&
&&&&&&& {&
&&&&&&&&&& return stTmpInfo[i].pN&
&&&&&&& }&
&&& return &No match Name&;&&&&&
&&&&&&&&&&&&&&&
int main(int argc, char *argv[])&
& int iId = 2;&&
& char *pName = GetStaffNameById(iId);&
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);&
& system(&PAUSE&);&&&
& return 0;&
#include &stdio.h&
#include &stdlib.h&
typedef struct _STSTAFFINFO
&&& char *pN
&&& int iId;&&&& /*ID*/&
char* GetStaffNameById(int iId)
&&& static stStaffInfo stTmpInfo[] =
&&&&&&& {&Socrates&, 1},
&&&&&&& {&dyx1024&, 2},
&&&&&&& {&Kevin&, 3},
&&&&&&& {&Jim&, 4}
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)
&&&&&&& if (stTmpInfo[i].iId == iId)
&&&&&&&&&& return stTmpInfo[i].pN
&&& return &No match Name&;&&&
&&&&&&&&&&&&&
int main(int argc, char *argv[])
& int iId = 2;
& char *pName = GetStaffNameById(iId);
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);
& system(&PAUSE&);&
& return 0;
3、修改接口,通过出参取回。
#include &stdio.h&&&
#include &stdlib.h&&&
typedef struct _STSTAFFINFO&
&&& char *pN&&
&&& int iId;&&&&&&
}stStaffI&
void GetStaffNameById(int iId, int iNameLen, char *pOutName)&
&&& stStaffInfo stTmpInfo[] =&&
&&&&&&& {&Socrates&, 1},&
&&&&&&& {&dyx1024&, 2},&
&&&&&&& {&Kevin&, 3},&
&&&&&&& {&Jim&, 4}&
&&& if (NULL == pOutName)&
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)&
&&&&&&& if (stTmpInfo[i].iId == iId)&
&&&&&&& {&
&&&&&&&&&& strncpy(pOutName, stTmpInfo[i].pName, iNameLen);&
&&&&&&&&&&&
&&&&&&& }&
&&& strncpy(pOutName, &No match Name&, iNameLen);&
&&&&&&&&&&&&&&&
int main(int argc, char *argv[])&
& int iId = 20;&&
& char szName[21] = &\0&;&
& GetStaffNameById(iId, 20, szName);&
& printf(&Staff Name is : %s(id = %d)\n&, szName, iId);&
& system(&PAUSE&);&&&
& return 0;&
#include &stdio.h&
#include &stdlib.h&
typedef struct _STSTAFFINFO
&&& char *pN
&&& int iId;&&&&
void GetStaffNameById(int iId, int iNameLen, char *pOutName)
&&& stStaffInfo stTmpInfo[] =
&&&&&&& {&Socrates&, 1},
&&&&&&& {&dyx1024&, 2},
&&&&&&& {&Kevin&, 3},
&&&&&&& {&Jim&, 4}
&&& if (NULL == pOutName)
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)
&&&&&&& if (stTmpInfo[i].iId == iId)
&&&&&&&&&& strncpy(pOutName, stTmpInfo[i].pName, iNameLen);
&&&&&&&&&&
&&& strncpy(pOutName, &No match Name&, iNameLen);
&&&&&&&&&&&&&
int main(int argc, char *argv[])
& int iId = 20;
& char szName[21] = &\0&;
& GetStaffNameById(iId, 20, szName);
& printf(&Staff Name is : %s(id = %d)\n&, szName, iId);
& system(&PAUSE&);&
& return 0;
4、通过子程序分配内存,调用者释放解决。
#include &stdio.h&&&
#include &stdlib.h&&&
typedef struct _STSTAFFINFO&
&&& char *pN /*Ð&O&A&*/&&
&&& int iId;&&&& /*ID*/&&&
}stStaffI&
/*&&¾&YID&&&E&Ð&O&A&*/&
char* GetStaffNameById(int iId)&
&&& int iMaxNameLen = 20;&
&&& stStaffInfo stTmpInfo[] =&&
&&&&&&& {&Socrates&, 1},&
&&&&&&& {&dyx1024&, 2},&
&&&&&&& {&Kevin&, 3},&
&&&&&&& {&Jim&, 4}&
&&& char *pRetName = (char *)malloc(iMaxNameLen);&
&&& if (NULL == pRetName)&
&&&&&&& exit(1);&
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)&
&&&&&&& if (stTmpInfo[i].iId == iId)&
&&&&&&& {&
&&&&&&&&&& strncpy(pRetName, stTmpInfo[i].pName, iMaxNameLen);&
&&&&&&&&&& return pRetN&
&&&&&&& }&
&&& strncpy(pRetName, &No match Name&, iMaxNameLen);&
&&& return pRetN&
&&&&&&&&&&&&&&&
int main(int argc, char *argv[])&
& int iId = 2;&
& char *pName = GetStaffNameById(iId);&
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);&
& free(pName);&
& pName = NULL;&
& system(&PAUSE&);&&&
& return 0;&
#include &stdio.h&
#include &stdlib.h&
typedef struct _STSTAFFINFO
&&& char *pN /*Ð&O&A&*/
&&& int iId;&&&& /*ID*/&
/*&&¾&YID&&&E&Ð&O&A&*/
char* GetStaffNameById(int iId)
&&& int iMaxNameLen = 20;
&&& stStaffInfo stTmpInfo[] =
&&&&&&& {&Socrates&, 1},
&&&&&&& {&dyx1024&, 2},
&&&&&&& {&Kevin&, 3},
&&&&&&& {&Jim&, 4}
&&& char *pRetName = (char *)malloc(iMaxNameLen);
&&& if (NULL == pRetName)
&&&&&&& exit(1);
&&& for (i = 0; i & sizeof(stTmpInfo) / sizeof(stTmpInfo[0]); i++)
&&&&&&& if (stTmpInfo[i].iId == iId)
&&&&&&&&&& strncpy(pRetName, stTmpInfo[i].pName, iMaxNameLen);
&&&&&&&&&& return pRetN
&&& strncpy(pRetName, &No match Name&, iMaxNameLen);
&&& return pRetN
&&&&&&&&&&&&&
int main(int argc, char *argv[])
& int iId = 2;
& char *pName = GetStaffNameById(iId);
& printf(&Staff Name is : %s(id = %d)\n&, pName, iId);
& free(pName);
& pName = NULL;
& system(&PAUSE&);&
& return 0;
摘自 Socrates的专栏

我要回帖

更多关于 支原体肺炎多久能好 的文章

 

随机推荐