指定作为参数传入的函数指针

时间:2018-03-26 17:39:21

标签: c pointers function-pointers

是否可以将函数指针传递给函数并让该函数指定要使用的函数?

下面是我的意思的一个例子:

void sub(int *a, int *b, int *c)
{
    *c = *a + *b;
}

void add(int *a, int *b, int *c)
{
    *c = *a - *b;
}

void switch_function(void (*pointer)(int*, int*, int*), int i)
{
    switch(i){
        case 1:
            pointer = &add;
            break;
        case 2:
            pointer = ⊂
            break;
    }
}

int main()
{
    int a;
    int b;
    int c;
    void (*point)(int*, int*, int*);

    switch_function(point, 1); // This should assign a value to `point`
    a = 1;
    b = 1;
    c = 0;
    (*point)(&a, &b, &c);

    return 0;
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以创建指向函数指针的指针。

以下是语法:

void (**pointer)(int*, int*, int*);

初始化之后,您可以取消引用此指针以设置函数指针:

*pointer = &add;
*pointer = ⊂

所以你的功能看起来像这样:

void switch_function(void (**pointer)(int*, int*, int*), int i)
{
    switch(i) {
        case 1:
            *pointer = &add;
            break;
        case 2:
            *pointer = ⊂
            break;
    }
}

...你可以这样称呼它:

switch_function(&point, 1);

答案 1 :(得分:2)

如果对函数指针使用typedef,语法会容易得多。特别是如果你在样本中使用双重间接。

typedef void (*fptr)(int*, int*, int*);

void sub(int *a, int *b, int *c)
{   
    *c = *a - *b;
}

void add(int *a, int *b, int *c)
{   
    *c = *a + *b;
}

void switch_function(fptr *pointer, int i)
{
    switch(i){
        case 1:
            *pointer = &add;
            break;
        case 2:
            *pointer = ⊂
            break;
    }
}

int main()
{
    int a;
    int b;
    int c;
    fptr point;

    switch_function(&point, 1);
    a = 1;
    b = 1;
    c = 0;
    (**point)(&a, &b, &c);

    return 0;
}