4

如何创建一个包含十个函数指针的数组?我有一个 for 循环,我想在每次迭代时将函数指针设置为不同的函数。所以:

//pseudocode
for i (0..10)
    function = array_of_functions[i];
//...
4

5 回答 5

8
// Define alias for function pointer type for convenience
typedef void (*action)(int);

// Example function
void print(int) { ... }

action fs[10] = { print, ... };
for (int i = 0; i < 10; ++i)
{
    action f = fs[i];

    // Call it somehow
    f(i * i);
}
于 2009-07-30T21:13:39.223 回答
4

这段代码:

return_t (*array_of_functions[10])(arg1_t, arg2_t);

将“array_of_functions”声明为一个 10 元素的函数指针数组,其中每个指向的函数接受两个类型为 arg1_t 和 arg2_t 的参数并返回类型为 return_t。替换类型并根据需要调整参数的数量。

于 2009-07-30T21:13:18.817 回答
2

最简单的方法是为您的函数创建一个 typedef,然后声明一个具有该类型的数组。要为函数创建 typedef:typedef returntype (*typedefname)(argtype1,argtype2,...,argtypeN);EX:

#include <stdio.h>
#include <stdlib.h>

typedef void (*functype)();

void func1()
{
 //...
}

void func2()
{
 //..
}

//...


void func10()
{
//...
}

int main(int argc, char* argv[])
{
     functype array[] = 
     { 
         &func1, 
         &func2, 
         &func3, 
         &func4, 
         &func5,
         &func6, 
         &func7, 
         &func8, 
         &func9, 
         &func10
     };

     // Use the array...
     return 0;   
}
于 2009-07-30T21:15:13.243 回答
2

任何时候你必须处理丑陋的函数指针语法,最好使用 typedef。

#include <iostream>

void a(int i)
{
    std::cout<<"a: "<<i<<std::endl;
}

void b(int i)
{
    std::cout<<"b: "<<i<<std::endl;
}

typedef void (*fn)(int);

int main(int argc, char**argv)
{

    fn foo[2];


    foo[0] = a;
    foo[1] = b;


    for(size_t i = 0; i < sizeof(foo) / sizeof(foo[0]); ++i)
    {
        foo[i](i);
    }

    return 0;
}
于 2009-07-30T21:20:35.887 回答
1
T (*array_of_functions[10])();

其中 T 是每个函数的返回类型(所有函数自然返回相同的类型)。如果您想存储指向具有不同数量/类型参数的函数的指针,事情就会变得棘手:

int foo(void) {...}
int bar(int x) {...}
int bletch(double y, double z) {...}
...
int (*array_of_functions[10])() = {foo, bar, bletch, ...};

如果是这样,您必须以某种方式跟踪每个函数所需的参数数量和类型,以便您可以正确调用它。

实际上,我对函数指针类型的 typedef 有点失望。它们往往会尽可能地模糊化。

于 2009-07-30T21:29:16.163 回答