两分钟了解函数指针-两分钟了解函数指针
热门回复:
- 新木xinmu:把0x1000强转成空参空返回的函数指针, 然后调用, 也就是((void(*)(void))0x1000)();
- mq白cpp:函数名是个jb地址,等下就得扯数组名是指向数组地址的指针了。有没有一种可能,函数名表函数?数组名表数组?a表a,b表b,有隐式转换就把a说成b了????
- 洒家名叫Nick:typedef int(*T)(int,int);
T p=0x1000;
p();
- 荣文戈-北航:严格来说,函数名不是函数的入口地址,函数名是一个标识符,这个标识符做evaluate的结果是入口地址,类型为指向函数的指针。
例如,假设有以下这个函数
int func(int a, int b)
{
printf("success\n");
return 0;
}
在main函数里面,我们可以看到&func返回值和func的返回值,其值和值的类型都是一样的。同样的,func可以用于调用这个函数,&func,*func, **func, ***func, **************func都可以用来调用这个函数,甚至(1? func: NULL)(1,2);也可以,因为函数调用要求括号前面的那个表达式做evaluate的返回值类型是一个合法的函数指针类型就行,因为func, &func, *func, *********func这些表达式的结果都是<函数入口地址,指向该函数类型的指针>,其背后的原因和给定一个数组名,比如int a【10】,&a这个表达式返回值类型是<首地址,int(*)【10】>,而a这个表达式返回值为<首地址,int*>道理一样,函数名对应的类型为函数类型,这里func能识别的类型是int(int, int),所以&func这个表达式的值是<入口地址, int(*)(int, int)>,而func这个表达式返回值也是<入口地址, int(*)(int, int)。这里&func的逻辑和&a的evaluate逻辑是一样的,而func和a的evaluate逻辑则是受到各自表达式的value computation的语法约定。
int main()
{
int(*p)(int, int) = func;
int(*q)(int, int) = &func;
func(1, 2);
(&func)(1,2);
(*func)(1,2);
(**func)(1,2);
(***func)(1,2);
return 0;
}
- 狡猾大先生:main
{
int (*p)(int, int) = 0x1000;
p();
}