在 C 中投射指向 main 函数的指针

Cast a pointer to point to main function in C

嗨,我看到一个指针的例子如下:

void main()
{
    int a=197,*p=&a;
    (int(*)())p==main;
} 

不知道(int(*)())p==main这个语句是干什么的?

== 是比较运算符。您正在将指向 main() 函数的指针与指向变量 a 的指针进行比较。但是您没有使用比较,例如在 if 语句中,因此该行实际上没有做任何事情。

如果我们把它分成更小的部分,我们有

  • (int(*)())p
  • ==
  • main

第一个是 p 到一个指针的强制转换,该指针接受不确定数量的参数(在 C 中)或没有参数(在 C++ 中)。

它将这个指针与 main 衰减到的指针进行比较。

然后丢弃布尔结果(结果未使用)。

请注意,这里 C 和 C++ 之间存在很大的语义差异。

I do not know what the statement (int(*)())p==main do ?

int(*)() 是一种类型。它是指向 returns int 且不带参数的函数的指针。

(T)expr 这是一个显式转换,即强制转换。右侧表达式的结果转换为括号中的类型。 (int(*)())expr 将右边的表达式转换为指向函数的指针。

(int(*)())p中转换后的表达式是pp 是指向 int 类型指针的变量。由于原始指针未指向函数,因此就 C++ 标准而言,结果值是任意的。

(int(*)())p==main 将转换后的指针与 main 函数的地址进行比较。比较的结果被丢弃。


P.S。您已声明 main returns void。这在 C++ 中是不允许的。此外,因此,指向函数 main 的指针与指针类型 int(*)() 不匹配。要解决此问题,请将 main 声明为 return int.