两分钟了解函数指针-两分钟了解函数指针

AID:
CID:
视频图片:
作者头像:
弹幕地址:
视频描述:

热门回复:

  • 新木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(); }