我遇到了下面显示的代码行。
我认为这可能是对返回 void 并采用 void 指针的函数指针的强制转换。那是对的吗?
(void (*)(void *))SGENT_1_calc
我遇到了下面显示的代码行。
我认为这可能是对返回 void 并采用 void 指针的函数指针的强制转换。那是对的吗?
(void (*)(void *))SGENT_1_calc
是的。该功能应该是这样的
void func(void*);
但是该语句缺少目标,因为强制转换为空是无用的。所以它应该像
func = (void (*)(void *))SGENT_1_calc;
是的,这是一个函数指针转换。
为了帮助您将函数转换为指针,您可以为函数指针类型定义别名,如下所示:
typedef void void_to_void_fct(void*);
您还可以为接受和返回值的函数定义类型:
typedef int math_operator(int, int);
稍后,您可以将函数存储到函数指针类型中,如下所示:
void mystery(void* arg) {
// do something nasty with the given argument
};
int add(int a, int b) {
return a + b;
}
void_to_void *ptr1 = mystery;
math_operator *ptr2 = add;
有时,您有如下功能print_str
:
void print_str(char* str) {
printf("%s", str);
}
并且您希望将其存储在与参数类型无关的函数指针中。然后,您可以使用这样的演员表:
(void (*)(void *))print_str
或者
(void_to_void_fct*)print_str
函数指针允许您在变量中“存储函数”(实际上,您存储了函数的地址)。当您希望允许某些代码根据用户输入具有不同的行为时,这非常方便。
例如,假设我们有一些数据和一些解码方法。我们可以有以下结构来保存这些信息:
typedef char* decoder_type(char*);
struct encoded_data {
char* data;
decoder_type *decoder_fct;
};
char* decoding_function_1(char* data) {
//...
char* decoding_function_2(char* data) {
//...
这允许存储数据和函数,以便以后一起使用它们来解码数据。