C语言 函数指针能不能进行类型转换?

例:
声明了函数指针 void(*f)(void);
能不能将其转换成 void(*f)(int),int(*f)(void),int(*f)(int)

这边尝试:

typedef (void)(*f1)(int)    //伪函数
void a(void)                //伪函数
void b(int)                    //伪函数
(f1)f //进行强制转换(类比 变量)
f=b;
f(1);

出现编译报错,提示参数太多。不明白哪个环节出了问题。


首先感谢@TianSong641针对提问的建议。

这里引用你回答里的例子

#include <stdio.h>

typedef void(*f1)(int);    // typedef 重命名,f1 类型 => void(*)(int)
void a(void);              // 函数声明    
void b(int);               // 函数声明

void(*f_a)(int);
int(*f_b)(void);
int(*f_c)(int);

void b(int val)           // 函数定义
{
    printf("void b(int val), val = %d\n", val);
}

int main()
{
    (f1)f_a;             // 编译通过
    (f1)f_b;             // 编译通过
    (f1)f_b;             // 编译通过
    
    f1 f;                // 定义函数指针,f 未初始化的野指针
    f = b;               // 让 f 指向 函数 b 
    f(1);
    
   return 0;
}

(f1)f_a;             // 编译通过
(f1)f_b;             // 编译通过
(f1)f_b;             // 编译通过

这边只是对指针进行强转

但是f_b还是不能指向b,然后f_b(1)进行调用;

    f_b=b;
    f_b(1);

image.png
其实我这边想了解的是
void()(int)、void()(void)、int(*)(void)这三种函数指针能不能强制进行类型转换?如果可以要怎么写
void(f1)(int)==>void(f1)(void);

void(*f1)(int);            //声明f1
void(*)(void)f1;        //f1类型强转?

当然上面的强转语法是错的。。因为我不晓得能不能这样做。。

阅读 2.5k
1 个回答
#include <stdio.h>

typedef void(*f1)(int);    // typedef 重命名,f1 类型 => void(*)(int)
void a(void);              // 函数声明    
void b(int);               // 函数声明

void(*f_a)(int);
int(*f_b)(void);
int(*f_c)(int);

void b(int val)           // 函数定义
{
    printf("void b(int val), val = %d\n", val);
}

int main()
{
    (f1)f_a;             // 编译通过
    (f1)f_b;             // 编译通过
    (f1)f_b;             // 编译通过
    
    f1 f;                // 定义函数指针,f 未初始化的野指针
    f = b;               // 让 f 指向 函数 b 
    f(1);
    
   return 0;
}

运行输出:[编译无错误无警告]

void b(int val), val = 1
  1. c 是及其灵活的,几乎任意的强制类型转换都可以,但代价是可能埋下很深的 bug
  2. 项目中遇到不寻常的写法,考虑这样做的意义是很好的习惯(学习除外)
  3. 询问问题,有基本可以遵循的规范。比如可以把代码贴完整、编译器的报错、代码块基本的 ; ,而不是笼统的抛出问题,这样人们才更乐于解答同时也是基本的尊重
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏