在 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
中转换后的表达式是p
。 p
是指向 int 类型指针的变量。由于原始指针未指向函数,因此就 C++ 标准而言,结果值是任意的。
(int(*)())p==main
将转换后的指针与 main
函数的地址进行比较。比较的结果被丢弃。
P.S。您已声明 main
returns void
。这在 C++ 中是不允许的。此外,因此,指向函数 main
的指针与指针类型 int(*)()
不匹配。要解决此问题,请将 main
声明为 return int
.
嗨,我看到一个指针的例子如下:
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
中转换后的表达式是p
。 p
是指向 int 类型指针的变量。由于原始指针未指向函数,因此就 C++ 标准而言,结果值是任意的。
(int(*)())p==main
将转换后的指针与 main
函数的地址进行比较。比较的结果被丢弃。
P.S。您已声明 main
returns void
。这在 C++ 中是不允许的。此外,因此,指向函数 main
的指针与指针类型 int(*)()
不匹配。要解决此问题,请将 main
声明为 return int
.