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
函数指针的地址,非常感谢你的帮助。