转换为函数指针?

时间:2013-04-04 09:26:12

标签: c function-pointers

遇到下面显示的代码行 我认为它可能是一个函数指针的转换,返回void并获取一个void指针,这是正确的吗?

(void (*)(void *))SGENT_1_calc

5 个答案:

答案 0 :(得分:34)

是的,这是对的。我发现它不是很易读,所以我建议声明要指出的函数的签名:

 typedef void sigrout_t(void*);

我还有编码约定,以rout_t结尾的类型是函数签名的类型。您可以另外命名,因为_t是Posix的后缀reserved

后者我正在施法,或许称之为

 ((sigrout_t*) SGENT_1_calc) (someptr);

答案 1 :(得分:5)

是的,功能应该看起来像这样

void func(void*);

但是声明错过了一个目标,因为无所作为是无用的。所以它应该像

func = (void (*)(void *))SGENT_1_calc;

答案 2 :(得分:0)

是的,这是你所说的演员。

答案 3 :(得分:0)

是的,它是一个函数指针,你可以用proto void funcname(void *)分配给一个函数 这里SGENT_1_calc可以直接分配给funcname

答案 4 :(得分:-1)

是的,这是function pointer演员表。

函数指针强制转换

为帮助您将函数强制转换为指针,可以为函数指针类型定义别名,如下所示:

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) {
//...

这允许同时存储数据和函数,以便以后一起使用它们对数据进行解码。