两分钟了解函数指针

作者: 学益得智能硬件分类: 校园学习 发布时间: 2023-01-16 11:38:06 浏览:7878 次

两分钟了解函数指针

新木xinmu:
把0x1000强转成空参空返回的函数指针, 然后调用, 也就是((void(*)(void))0x1000)();

【回复】看不懂哎。如果可以出个视频讲下就好了
【回复】这么弄的话会不会导致堆栈不平
mq白cpp:
函数名是个jb地址,等下就得扯数组名是指向数组地址的指针了。有没有一种可能,函数名表函数?数组名表数组?a表a,b表b,有隐式转换就把a说成b了????

【回复】回复 @mq白cpp :不是不是,好哥哥们,咱们别只宣泄情绪啊,我这我真不懂,也真好奇,老哥可以讲讲吗?[星星眼]
【回复】回复 @叩龙家口头禅 :你也就会这点了
【回复】那为c啥转成汇编,函数首地址的别名用函数名表示
荣文戈-北航:
严格来说,函数名不是函数的入口地址,函数名是一个标识符,这个标识符做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; }

yzyang2004:
(*(void(*)(void))0x1000)();原型:(*fp)(),fp = 0x1000,然后看(void)(*)(void),为强制类型转换,转为无入口参数也无返回参数的函数指针。(void)(*)(void)类似定义指针函数,然后带指针方式的引用该函数(*fp)(),也可以写成fp(),所以答案也可以((void(*)(void))0x1000)();

C语言 嵌入式开发

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!