我寫了一個全為 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));*/
}
uj5u.com熱心網友回復:
void *是指標型別。您不是在傳遞指標,而是在傳遞值,因此不會編譯。它意外地“起作用”,int因為大多數 C 編譯器將指標本身表示為整數。
如果您傳遞指標int,float和double代替int,float和double自己,你會避免編譯器錯誤。您還需要更改int_add和朋友獲取指標,并且您必須確保在使用它們之前取消參考指標。您還必須回傳指標,這意味著您必須malloc在堆上使用一些記憶體,因為一旦您的函式退出,分配給區域變數的堆疊記憶體將無效。然后,您將不得不free稍后再處理...最后,這將導致比您試圖解決的問題要復雜得多。
我不得不問你為什么要這樣做?C 真的不是這種模式的最佳語言。我建議只是呼叫int_add,float_add等等的功能,而不是直接試圖抽象他們以這種方式。
uj5u.com熱心網友回復:
因此,根據@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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406176.html
標籤:
上一篇:結構指標及其初始化
