【问题标题】:Assign a function pointer passed in as a parameter分配作为参数传入的函数指针
【发布时间】:2018-03-26 17:39:20
【问题描述】:

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

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

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

感谢任何帮助。

【问题讨论】:

  • 在这种特殊情况下,您应该返回一个函数指针。
  • 它确实应该有一个默认情况,其中pointer 在错误输入时设置为 NULL。调用该指针时最好崩溃而不是冒险调用某些实际函数。

标签: c pointers function-pointers


【解决方案1】:

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

语法如下:

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);

【讨论】:

  • 我想你也可以把它收紧一点,用add替换(例如)&add,因为后者已经是add地址
  • 指向函数指针的指针非常有意义,感谢您的帮助。
【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2020-11-08
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多