带有 void* return 和 void* 参数的函数指针
Function Pointer with void* return and void* parameters
我写了一个全为void*的函数指针,这样它就可以用于任何数值
- 整数
- 浮动
- 双.
但它只适用于int
加法函数
对于float
和double
加法函数,会抛出编译时错误。
为什么会这样?
如果您取消注释最后两行 printf
,您将收到错误消息
#include<stdio.h>
int int_add(int x, int y) {
return x + y;
}
float float_add(float x, float y) {
return x + y;
}
double double_add(double x, double y) {
return x + y;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
return op(x, y);
}
void main(void) {
printf("Sum= %d\n",(int*) do_operation(int_add, 1, 2));
/*printf("Sum= %f\n",(float*) do_operation(float_add, 1.20, 2.50));*/
/*printf("Sum= %lf\n",(double*) do_operation(double_add, 1.20, 2.50));*/
}
void *
是指针类型。您不是在传递指针,而是在传递值,因此不会编译。它意外地对 int
“有效”,因为大多数 C 编译器将指针本身表示为整数。
如果您将指针传递给 int
、float
和 double
而不是 int
、float
和 double
本身,您将避免该编译器错误。您还需要更改 int_add
和 friends 以获取指针,并且您必须确保在使用它们之前取消引用指针。您还必须 return 指针,这意味着您必须 malloc
堆上的一些内存,因为一旦函数退出,分配给局部变量的堆栈内存将无效。然后你将不得不 free
这一切都在以后......最后,这将导致比你试图解决的问题要复杂得多的问题。
我不得不问你为什么要这样做? C 确实不是这种模式的最佳语言。我建议直接调用 int_add
、float_add
等函数,而不是尝试以这种方式抽象它们。
所以根据@charles-srstka 的建议,我重写了代码,然后它按我想要的方式运行
#include<stdio.h>
#include<stdlib.h>
int* int_add(int *x, int *y) {
int *c = (int *)malloc(sizeof(int));
*c = *(int*)x + *(int*)y;
return c;
}
float* float_add(float *x, float *y) {
float *c = (float*)malloc(sizeof(float));
*c = *(float*)x + *(float*)y;
return c;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
return op(x, y);
}
void main(void) {
int a = 1;
int b = 2;
int *c;
c = do_operation(int_add, &a, &b);
printf("%d\n",*c);
free(c);
float x = 1.1;
float y = 2.2;
float *z;
z = do_operation(float_add, &x, &y);
printf("%f\n",*z);
free(z);
}
我写了一个全为void*的函数指针,这样它就可以用于任何数值
- 整数
- 浮动
- 双.
但它只适用于int
加法函数
对于float
和double
加法函数,会抛出编译时错误。
为什么会这样?
如果您取消注释最后两行 printf
,您将收到错误消息
#include<stdio.h>
int int_add(int x, int y) {
return x + y;
}
float float_add(float x, float y) {
return x + y;
}
double double_add(double x, double y) {
return x + y;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
return op(x, y);
}
void main(void) {
printf("Sum= %d\n",(int*) do_operation(int_add, 1, 2));
/*printf("Sum= %f\n",(float*) do_operation(float_add, 1.20, 2.50));*/
/*printf("Sum= %lf\n",(double*) do_operation(double_add, 1.20, 2.50));*/
}
void *
是指针类型。您不是在传递指针,而是在传递值,因此不会编译。它意外地对 int
“有效”,因为大多数 C 编译器将指针本身表示为整数。
如果您将指针传递给 int
、float
和 double
而不是 int
、float
和 double
本身,您将避免该编译器错误。您还需要更改 int_add
和 friends 以获取指针,并且您必须确保在使用它们之前取消引用指针。您还必须 return 指针,这意味着您必须 malloc
堆上的一些内存,因为一旦函数退出,分配给局部变量的堆栈内存将无效。然后你将不得不 free
这一切都在以后......最后,这将导致比你试图解决的问题要复杂得多的问题。
我不得不问你为什么要这样做? C 确实不是这种模式的最佳语言。我建议直接调用 int_add
、float_add
等函数,而不是尝试以这种方式抽象它们。
所以根据@charles-srstka 的建议,我重写了代码,然后它按我想要的方式运行
#include<stdio.h>
#include<stdlib.h>
int* int_add(int *x, int *y) {
int *c = (int *)malloc(sizeof(int));
*c = *(int*)x + *(int*)y;
return c;
}
float* float_add(float *x, float *y) {
float *c = (float*)malloc(sizeof(float));
*c = *(float*)x + *(float*)y;
return c;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
return op(x, y);
}
void main(void) {
int a = 1;
int b = 2;
int *c;
c = do_operation(int_add, &a, &b);
printf("%d\n",*c);
free(c);
float x = 1.1;
float y = 2.2;
float *z;
z = do_operation(float_add, &x, &y);
printf("%f\n",*z);
free(z);
}