C 编写一个函数,将指向任何函数的指针作为参数
我在用C语言编写指针。我必须编写一个程序,使用函数和指针对一个数字(sqrt、sin、exp)进行3次运算。我已经这样做了,但是我有一个问题,编写一个函数,该函数以指向上述任何函数的指针+浮点数作为参数,返回相应计算的结果。 在主功能中,我附加了不带此功能的工作代码。我不知道如何编写这个函数,我用这段代码编写了我的try。在此,我附上我编写的代码:C 编写一个函数,将指向任何函数的指针作为参数,c,function-pointers,function-declaration,C,Function Pointers,Function Declaration,我在用C语言编写指针。我必须编写一个程序,使用函数和指针对一个数字(sqrt、sin、exp)进行3次运算。我已经这样做了,但是我有一个问题,编写一个函数,该函数以指向上述任何函数的指针+浮点数作为参数,返回相应计算的结果。 在主功能中,我附加了不带此功能的工作代码。我不知道如何编写这个函数,我用这段代码编写了我的try。在此,我附上我编写的代码: #include <stdio.h> #include <math.h> double square(double *);
#include <stdio.h>
#include <math.h>
double square(double *);
double sinus(double *);
double exponential(double *);
void count(*square, double result);
double number, square_result, sinus_result, exponential_result;
int main()
{
printf("Give number: ");
scanf("%lf", &number);
square_result = square(&number);
sinus_result = sinus(&number);
exponential_result = exponential(&number);
printf("%lf\n", square_result);
printf("%lf\n", sinus_result);
printf("%lf", exponential_result);
}
double square(double *x)
{
double square_result;
square_result = sqrt(*x);
return square_result;
}
double sinus(double *x)
{
double sinus_result;
sinus_result = sin(*x);
return sinus_result;
}
double exponential(double *x)
{
double exponential_result;
exponential_result = exp(*x);
return exponential_result;
}
void count(*square, double result)
{
result = square(&number);
}
#包括
#包括
双正方形(双*);
双窦(双*);
双指数(双*);
无效计数(*平方,双结果);
双数、平方、正弦、指数;
int main()
{
printf(“给出编号:”);
scanf(“%lf”和编号);
平方_结果=平方(&数字);
窦房结\结果=窦房结和数量;
指数结果=指数(&数字);
printf(“%lf\n”,平方结果);
printf(“%lf\n”,结果);
printf(“%lf”,指数结果);
}
双正方形(双*x)
{
双平方结果;
平方结果=sqrt(*x);
返回平方结果;
}
双窦(双*x)
{
双窦造影结果;
窦房结结果=sin(*x);
返回结果;
}
双指数(双*x)
{
双指数结果;
指数结果=exp(*x);
返回指数结果;
}
无效计数(*平方,双结果)
{
结果=平方(&数字);
}
对于初学者来说,将函数参数声明为指针类型double*
没有任何意义
double square(double *);
double sinus(double *);
double exponential(double *);
因为函数中未更改类型为double
的通过引用传递的对象
声明如下函数
double square(double );
double sinus(double );
double exponential(double );
double ( *fp[] )( double ) = { square, sinus, exponential };
size_t N = sizeof( fp ) / sizeof( *fp );
他们将被称为
square_result = square( number);
sinus_result = sinus( number);
exponential_result = exponential(number);
所有这些函数都具有
double( double)
或者指向这样一个函数的指针的类型
double ( * )( double )
Func * fp[] = { square, sinus, exponential };
因此,您可以声明所需的函数,例如
double f( double calc( double ), double value );
double result = f( square, number );
或同等地
double f( double ( * calc )( double ), double value );
在这里,您可以使用自己的名称,而不是f和calc
函数可以被调用,例如
double f( double calc( double ), double value );
double result = f( square, number );
在函数中,您可以编写
double f( double ( * calc )( double ), double value )
{
return calc( value );
}
您可以声明指向函数的指针数组,如
double square(double );
double sinus(double );
double exponential(double );
double ( *fp[] )( double ) = { square, sinus, exponential };
size_t N = sizeof( fp ) / sizeof( *fp );
并在循环中调用函数
for ( size_t i = 0; i < N; i++ _
{
double result = f( fp[i], number );
//...
}
更简单的是,可以引入typedef名称。比如说
typedef double Func( double );
在本例中,数组声明如下所示
double ( * )( double )
Func * fp[] = { square, sinus, exponential };
参考您的代码,使用(1)指针或(2)返回值 (1) 表示使用原始变量(原始地址),并且可以在子例程中更改。那就什么都不用还了 (2) 变量值提供给子例程,子例程将返回结果。然后子例程的输入参数不需要是指针 然后(1)是(注意输入值被结果值替换) 或者(1)如果您不希望输入被结果替换
void square_root(double a, double *x)
{
*x = sqrt(a);
}
或(2)是
或者(2)在较短的时间内
double square_root(double a)
{
return sqrt(a);
}
评论:通常,我会选择第一(2)个版本。否则,如果您想使用指针,例如,因为您想从子例程中获取多个值,那么请使用(1)的第二个版本
注释2:指针可能非常有用。有时指针(几乎)是唯一的解决方案。您需要熟悉指针的使用。如果不是,你宁愿引入一个潜在的风险,如果事情不太正确。你需要知道为什么会这样
注释3:关于指向函数的指针。我建议,首先了解数据指针的概念。现在跳过指向函数的指针,除非你在学校需要它。那么以下内容可能是一个很好的参考:
我创建了一个函数
call_func
将函数上的指针作为参数和一个双精度*
,如下所示:
//参数是指向任何接受参数double*和double*数字的函数的指针
double call_func(double(*MyFunction)(double*arg),double*number)
{
返回(MyFunction)(编号);
}
//一个小的编辑,不需要通过指针传递number
这应该这样称呼:
square\u result=调用函数(square,number);
窦房结结果=调用函数(窦房结,编号);
指数结果=调用函数(指数,数字);
在这里,它集成在您的代码中:
//这是我的函数,它将函数指针作为参数
双重调用函数(双重(*MyFunction)(双重*arg),双重编号);
int main()
{
printf(“给出编号:”);
scanf(“%lf”和编号);
平方_结果=平方(&数字);
窦房结\结果=窦房结和数量;
指数结果=指数(&数字);
printf(“%lf\n”,平方结果);
printf(“%lf\n”,结果);
printf(“%lf”,指数结果);
//调用我的一般函数
printf(“\n***************************************\n”);
printf(“\n\n函数指针的用法”);
双平方结果2=0.0;
双窦结果2=0.0;
双指数结果2=0.0;
square\u result2=调用函数(square和number);
窦房结结果2=调用函数(窦房结和号码);
指数结果2=调用函数(指数和数字);
printf(“%lf\n”,平方结果2);
printf(“%lf\n”,结果2);
printf(“%lf”,指数结果2);
}
//参数是指向任何接受参数双精度和双精度数字的函数的指针
double call_func(double(*MyFunction)(double*arg),double*number)
{
返回(MyFunction)(编号);
}
这可能很有帮助:或者最好是typedef double myfunc\t(double)代码>然后双f(myfunc\u t*calc,双值)
。谢谢。一个非常小的建议:在函数中使用double
而不是double*
可能更好。它将提高可读性并避免使用和调用<代码>必须时按指针传递,可以时按值传递。