无法理解指针语句

Jen*_*ada 6 c pointers puts

我正在做一个ctf问题,有一条线我无法理解.

int  (*fp)(char *)=(int(*)(char *))&puts, i;
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这是什么意思?

pmg*_*pmg 5

fp 是一个指针

(*fp)
Run Code Online (Sandbox Code Playgroud)

功能

(*fp)(
Run Code Online (Sandbox Code Playgroud)

接受1个类型的参数 char

(*fp)(char)
Run Code Online (Sandbox Code Playgroud)

并返回一个类型的值 int

int (*fp)(char)
Run Code Online (Sandbox Code Playgroud)

指针puts在大部分为冗余的转换后使用的地址进行初始化。

int  (*fp)(char *)=(int(*)(char *))&puts
int  (*fp)(char *)=(int(*)(char *))puts // & redundant
int  (*fp)(const char *)=puts
Run Code Online (Sandbox Code Playgroud)

该对象i未初始化。它有类型int

int  (*fp)(char *)=(int(*)(char *))&puts, i;
Run Code Online (Sandbox Code Playgroud)