'((void(*)())0x1000)();`是什么意思?

这里是一个代码,目的是设置程序计数器跳转到地址0x1000 。 我知道它做了什么,但我不明白如何。 这与我缺乏C语言知识有关。 可能是你可以开导我。 这里是声明/函数(我甚至不知道它是什么:))

 ((void (*)())0x1000)(); 

我的事情是指向一个返回void和不接受任何参数的函数的指针。 如果我错了,请纠正我。

使用一个简单的规则从内部解码C声明:从标识符开始,在右边检查[] (array)或() (function),然后在左边检查值的types(存储在数组或由函数返回),而不会交叉括号; 从括号中跳出并重复。

例如:

 void (*p)() 

p是(没有在右边) 一个指针 (在左边,不要越过圆括号) (转义括号,读下一个级别) 一个函数 (右) 不返回任何东西 (左)。

当标识符(在本例中为p )缺失时,所有剩下的就是一个types声明。

放在括号内的types,放在一个值的前面是一个types转换。

 (void (*)())0x1000 

将数字0x1000转换为指向不返回任何内容的函数指针 (有关上面的p声明的段落括号内的内容)。

在下一层,上面的expression式(一个指向函数的指针可以用和函数名相同的方式使用)来执行指向的代码。

看下面的整个expression去组成:

 ( ( void (*)() /* type: pointer to function that doesn't return anything */ )0x1000 /* value 0x1000 treated as a value of the type declared above */ ) /* enclose in parentheses to specify the order of evaluation */ (); /* the pointer above used as a function name to run the code */ 

(void (*)())是一个指向返回void的函数的指针,并且指定了一个未指定但固定数量的参数。

(void (*)())0x1000正在将文字0x1000 强制转换为上述types。

最后是后缀() 调用函数。 前面的expression式需要在括号中,否则后缀()将绑定到0x1000 ,这在语法上是不合法的。

这是由你来检查铸造是否真的有效。 如果没有,那么你的程序的行为是不确定的

一个常数

 0x1000 

被投射到一个types:

 (type)0x1000 

types是void (*)() – 一个函数的指针(星号),不带任何参数(右括号中的圆括号)(oops,请参阅pmg的注释 )并返回没有值(左边的void )。 星号上的附加元素可以防止将其关联到void ,这会在这里错误地创build一个void *types。

所以在强制转换之后,在地址0x1000处有一个指向无参数参数的void函数:

 (void (*)())0x1000 

那function…

 ((void (*)())0x1000) 

通过添加一个空的参数列表来调用:

 ((void (*)())0x1000)(); 

编写该代码的人应该以可读的方式重写它,如下所示:

 #define ADDRESS_OF_FUNCTION_X 0x1000 typedef void (*func_ptr_t)(void); ... func_ptr_t function_x = (func_ptr_t)ADDRESS_OF_FUNCTION_X; function_x(); 

代码做的事情现在非常自我logging。