c语言中能不能定义函数数组
int f[5](int a,int b),就有5个函数了,函数名分别是f[0],f[1],.....f[5].,不知道有没有那种方法能实现啊?
我是在写求积分问题时,由于积分方程太多,一个一个声明太麻烦,于是我就想到可不可以定义一个数组函数,一次就行了,然后用一个指针函数就方便多了,但是显示出错信息error C2092: array element type cannot be function 展开
函数不可以定义为数组,可以用函数指针来操作。
1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表)。
例如:
double add(double a,double b){}
double sub(double a,double b){}
double mul(double a,double b){}
double div1(double a,double b){}
double (*oper_func[])(double, double) = {add,sub,mul,div1};//函数指针的数组定义。
2.函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。
扩展资料:
指针函数和函数指针的区别:
这两个概念都是简称,指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示:返回类型标识符*函数名称。
返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。
函数不可以定义为数组,可以用函数指针来操作。
1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表)。
例如:
double add(double a,double b){};
double sub(double a,double b){};
double mul(double a,double b){};
double div1(double a,double b){};
double (*oper_func[])(double, double) = {add,sub,mul,div1};//函数指针的数组定义
2.函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
3.函数指针的声明方法为:
返回值类型( * 指针变量名) (形参列表);
“返回值类型”说明函数的返回类型,“( * 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f = func; /* 将func函数的首地址赋给指针f */
或者使用下面的方法将函数地址赋给函数指针:
f = &func;
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
例子:
#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main(){
int (*ptr)(int, int);
int a, b, c;
ptr = max;
scanf("%d%d", &a, &b);
c = (*ptr)(a,b);
printf("a=%d, b=%d, max=%d", a, b, c);
return 0;
}
给你个例子
fun function[4]={print_on_a,print_on_b,print_on_c,print_on_d};
看到没数组中都是函数名,函数名实际上就是函数的地址,就和数组名是数组地址一样。
具体代码如下:
#include <stdio.h>
typedef void (*fun)(void); //这个是函数指针
void print_on_a()
{
printf("a\n");
}
void print_on_b()
{
printf("b\n");
}
void print_on_c()
{
printf("c\n");
}
void print_on_d()
{
printf("d\n");
}
void main()
{
fun function[4]={print_on_a,print_on_b,print_on_c,print_on_d};
(*function[0])();
}
#include <stdlib.h>
typedef int (*PF_CALC) (int a, int b);
int func1(int a, int b)
{
return a+b+10;
}
int func2(int a, int b)
{
return a+b+20;
}
int func3(int a, int b)
{
return a+b+30;
}
int func4(int a, int b)
{
return a+b+40;
}
int func5(int a, int b)
{
return a+b+50;
}
void main()
{
PF_CALC pFuncList[5] = {func1, func2, func3, func4, func5};
for (long k=0; k<5; k++)
{
printf("Test Func %d (2, 4): %d\n",
k, pFuncList[k](2,4));
}
}
但是函数指针有时有移植的问题,所以我会选择以下代码,容易理解和维护:
int func_all(int type, int a, int b)
{
switch(type)
{
case 0: return func1(a,b);
case 1: return func2(a,b);
case 2: return func3(a,b);
case 3: return func4(a,b);
case 4: return func5(a,b);
}
return 0;
}
void main()
{
// PF_CALC pFuncList[5] = {func1, func2, func3, func4, func5};
for (long k=0; k<5; k++)
{
printf("Test Func %d (2, 4): %d\n",
k, func_all(k,2,4));
}
}