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

C 指定作为参数传入的函数指针,c,pointers,function-pointers,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

是否可以传入指向函数的函数指针,并让该函数指定要使用的函数

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

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

非常感谢您的帮助。

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

以下是语法:

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);
…你会这样称呼它:

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

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

以下是语法:

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);
…你会这样称呼它:

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

如果对函数指针使用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;
}

如果对函数指针使用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;
}

在这种特殊情况下,您应该返回一个函数指针。它应该有一个默认情况,即在输入错误时,
pointer
设置为NULL。调用该指针时最好崩溃,而不要冒险调用某个实际函数。在这种情况下,您应该返回一个函数指针。它应该有一个默认情况,即在输入错误时,
指针
设置为NULL。调用该指针时最好崩溃,而不要冒险调用某个实际函数。我认为您还可以将其收紧一点,并将(例如,
&add
替换为
add
,因为后者已经是
add
函数指针的地址,非常有意义,谢谢你的帮助。我想你也可以把它收紧一点,用
add
替换(例如
&add
),因为后者已经是
add
函数指针的地址,非常感谢你的帮助。