C语言 指针数组如何存放函数地址

**********************以下问题均在C语言当中讨论************************************

【问题1】指针数组可以存放函数的地址吗?
【问题2】如果可以,数组指针类型是啥?是int *num[ ]还是chan *num[ ]还是其他类型?
【问题3】如果可以,有木有简单方法解决下面问题

有100个函数,HS1(),HS2(),HS3(),……,HS98(),HS99(),HS100()。
还有1个指针数组num[100]来存放这100个函数的地址,

要求将 HS1()的地址放到num(1)中, HS2()地址放到num(2)中, HS3()的地址放到num(3)中, 以此类推 直到 HS100()的地址放到num(100)

当然一个挨着一个的地址赋值是可以的,但那样要100次才行,能不能利用for,while,if等语句甚至构造其他函数等方法 进行地址赋值?

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.函数指针是指向函数的指针变量。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
返回值类型( * 指针变量名) (形参列表);
“返回值类型”说明函数的返回类型,“( * 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例子:

#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;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-12
#include "stdio.h"
void output(int x)
{
printf("%d\n",x);
}
void main()
{
void(*test[100])(int);//函数指针数组的定义,我试验的只能是固定大小的数组,动态数组不知道怎么弄
for (int i=0;i<100;i++)
{
test[i] = output;
(*test[i])(i);
}

}
这个程序的输出是100行数字从0~99
第2个回答  2013-05-13
你的问题大家回答的差不多我,我只对最后的问题回答下:对函数指针数组的赋值必然得有一个个手工写的过程。
第3个回答  2013-05-12
1、数组里面可以存放函数地址,这就是传说中的函数指针数组。
2、数组指针就是一个指针里面存放数组的首地址的指针,int (* num)[ ]是这种类型。
3、定义
typedef int (* a)(参数类型列表);//重定义函数名
a num[100];
int i ;
for(i = 1;i<=100;i++)
num[i] = HSi;
第4个回答  2013-05-12
这种情况,HS1(),HS2(),~ HS100() 这些函数的参数类型和返回值最好是完全相同的,这样才能放到同一个数组中才能再次对其调用并使用。

举个例子,下面是省略简写的100个函数在for循环中分别被调用后输出内容和返回值的处理方法,实际使用中可以参照这种方式进行使用,真正一个一个赋值的方法应该是不会用到的。

#include "stdio.h"

unsigned char HS1(unsigned char ucArg);
unsigned char HS2(unsigned char ucArg);
/* ………… */
unsigned char HS99(unsigned char ucArg);
unsigned char HS100(unsigned char ucArg);

unsigned char (*const wucFunctionPointer_tbl[])( unsigned char ) = {
HS1,
HS2,
/* ………… */
HS99,
HS100
};

void main(void)
{
unsigned char aucLoopCnt = 0;
unsigned char aucFuncReturn = 0;

for (aucLoopCnt = 0; aucLoopCnt < (sizeof(wucFunctionPointer_tbl)/sizeof(void*)); aucLoopCnt++)
{
aucFuncReturn = wucFunctionPointer_tbl[aucLoopCnt](aucLoopCnt);
printf("Function Return is %d\n", aucFuncReturn);
}
}

unsigned char HS1(unsigned char ucArg)
{
printf("This is HS1 Running: Arg is %d\n", ucArg);
return ucArg;
}

unsigned char HS2(unsigned char ucArg)
{
printf("This is HS2 Running: Arg is %d\n", ucArg);
return ucArg;
}

/* ………… */

unsigned char HS99(unsigned char ucArg)
{
printf("This is HS99 Running: Arg is %d\n", ucArg);
return ucArg;
}

unsigned char HS100(unsigned char ucArg)
{
printf("This is HS100 Running: Arg is %d\n", ucArg);
return ucArg;
}
相似回答