无法理解指针语句

Unable to understand a pointer statement

我在做ctf题,有一行看不懂

int  (*fp)(char *)=(int(*)(char *))&puts, i;

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

fp是指针

(*fp)

函数

(*fp)(

接受 1 个 char

类型的参数
(*fp)(char)

和 returns 类型的值 int

int (*fp)(char)

经过大部分冗余转换后,指针用 puts 的地址初始化。

int  (*fp)(char *)=(int(*)(char *))&puts
int  (*fp)(char *)=(int(*)(char *))puts // & redundant
int  (*fp)(const char *)=puts

对象 i 未初始化。它的类型为 int

int  (*fp)(char *)=(int(*)(char *))&puts, i;

首先是变量声明:

int  (*fp)(char *)

fp 是一个指向函数的指针,它接受一个 char * 参数并返回 int

然后fp被初始化为一个值:

(int(*)(char *))&puts

该值为 puts 函数的地址,转换为与 fp.

相同的类型

最后,还有一个变量声明:

int /* ... */, i;

此声明分为两部分:

int  (*fp)(char *)=(int(*)(char *))&puts, i;

第一个是:int (*fp)(char *)=(int(*)(char *))&puts; 说明:这是单语句中的函数指针声明和初始化。其中 fp 是指向函数 puts 的指针。如果您打印 fpputs 的值,它们将具有相同的值,即 puts 的地址。

#include<stdio.h>

int main()
{
  int  (*fp)(char *)=(int(*)(char *))&puts, i;
  printf("puts %p\n",puts);
  printf("fp %p\n",fp);
}

是:int i;