int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 注2:函数括号中的形参可有可无,视情况而定。
UBOOT中go命令的实现:
/*common/cmd_boot.c */
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong addr, rc; int rcode = 0; if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } addr = simple_strtoul(argv[1], NULL, 16); //地址存放在argv[1]中,将其转换为unsigned long格式 printf ("## Starting application at 0x%08lX ...\n", addr); rc = ((ulong (*)(int, char []))addr) (--argc, &argv[1]); /*addr是绝对地址,让程序跳转到绝对地址去执行, 则通过把绝对地址强制转换成函数指针(ulong (*)(int, char []))addr , 然后调用它 */ if (rc != 0) rcode = 1; printf ("## Application terminated, rc = 0x%lX\n", rc); return rcode; }