#include<stdio.h>
int Va[8]={NULL};
void Val( )
{
( ( void (*)( ) ) Va[0] )( );
( ( void (*)( ) ) Va[1] )( );
( ( void (*)( ) ) Va[2] )( );
( ( void (*)( ) ) Va[3] )( );
( ( void (*)( ) ) Va[4] )( );
( ( void (*)( int ) ) Va[5] )( 4 );
( ( void (*)( ) ) Va[6] )( );
( ( void (*)( ) ) Va[7] )( );
}
void main()
{
Val();
}
大哥大侠高手们 问一下 这个函数起什么功能 是一个老外论坛上看到的 看的很迷惑 帮忙解释一下啊
int Va[8]={NULL};
void Val( )
{
( ( void (*)( ) ) Va[0] )( );
( ( void (*)( ) ) Va[1] )( );
( ( void (*)( ) ) Va[2] )( );
( ( void (*)( ) ) Va[3] )( );
( ( void (*)( ) ) Va[4] )( );
( ( void (*)( int ) ) Va[5] )( 4 );
( ( void (*)( ) ) Va[6] )( );
( ( void (*)( ) ) Va[7] )( );
}
void main()
{
Val();
}
大哥大侠高手们 问一下 这个函数起什么功能 是一个老外论坛上看到的 看的很迷惑 帮忙解释一下啊
等价于这样
typedef void (*func)();
func=Va[0];
func();
具体干什么使得,不知道了
是不是VA[i]里所调用的是指向该地址的函数
有没有API也能做到这样呢?
(void (*)())外面加()是强制转换
((void (*)()) Va[0])是把Va[0]的值NULL,强制转换成上述类型的函数指针,也即强制编译器认为内存地址0是一个形如void f()函数的代码起始地址,外围的()是用来改变表达式优先级的
((void (*)()) Va[0])()最后加上尾部的(),就是函数调用了,即跳转到内存0地址开始执行函数调用但因为windows环境下内存地址0本身并不是代码,所以执行会出错,某些单片机的内存地址0有可能是引导程序