函数指针的取消引用是如何发生的?

函数指针的取消引用是如何发生的?

为什么和如何取消引用一个函数指针只是“什么都不做”?

这就是我要说的:

#include<stdio.h>void hello() { printf("hello"); }int main(void) { 
    (*****hello)(); }

从评论中这里:

函数指针的取消引用很好,但是得到的函数指示符将被立即转换回函数指针。


从一个答案这里:

删除(以您认为的方式)函数的指针意味着:访问代码内存,因为它将是一个数据内存。

函数指针不应该以这种方式取消引用。相反,它被称为。

我会用一个名字“取消”与“调用”并排。没事的。

无论如何:C的设计方式是,函数名标识符和变量保持函数的指针都是相同的:地址到代码内存。它允许在标识符或变量上使用Call()语法跳转到该内存。


多么,怎样一点儿没错函数指针的取消引用是否有效?



尚方宝剑之说
浏览 589回答 3
3回答

收到一只叮咚

这不是完全正确的问题。至少对C来说,正确的问题是函数值在rvalue上下文中会发生什么情况?(rvalue上下文是名称或其他引用应该用作值的任何地方,而不是位置-基本上是在转让的左边以外的任何地方)。名称本身来自右(边),正确的-作业的手边。)好的,那么在rvalue上下文中函数值会发生什么呢?它被立即隐式转换为指向原始函数值的指针。如果取消引用指针*,您将再次获得相同的函数值,该值将立即隐式转换为指针。你可以随心所欲地做很多次。你可以尝试两个类似的实验:如果取消引用lvalue背景-作业的左边。(如果您记住函数是不可变的,那么答案将是您所期望的。)数组值也在lvalue上下文中转换为指针,但它被转换为指向元素键入,而不是指向数组的指针。因此,去引用它将给您一个元素,而不是数组,并且您显示的疯狂不会发生。希望这能帮上忙。P.S.关于为什么函数值被隐式转换为指针,答案是对于那些使用函数指针的用户来说,不用使用是非常方便的&也有双重方便:调用位置上的函数指针自动转换为函数值,因此不必编写*通过函数指针调用。与C函数不同,C+函数可以重载,我没有资格评论C+中的语义是如何工作的。

慕尼黑5688855

站在编译器作者的立场上。函数指针具有定义良好的含义,它是指向表示机器代码的字节块的指针。当程序员取消函数指针时,您会做什么?您接受机器代码的第一个(或8个)字节并将其重新解释为指针吗?这样做不起作用的几率约为20亿比1。你申报UB吗?已经有很多这样的事情了。还是你忽视了这一企图?你知道答案。
打开App,查看更多内容
随时随地看视频慕课网APP