函数指针

你好,我看到你回复的贴子上面说,“对于函数指针,调用的时候分为显试解引用和隐式解引用,*p为显试解引用,如果用户不加*号,编译器会帮你隐式地加上*,所以*p和p的值是一样... 你好,我看到你回复的贴子上面说,“对于函数指针,调用的时候分为显试解引用和隐式解引用,*p为显试解引用,如果用户不加*号,编译器会帮你隐式地加上*,所以 *p 和 p 的值是一样的,最终转换为*p”

我的疑问是:p()这种形式去调用,既然函数调用编译器需要的就是函数指针,而p已经是函数指针了,为了还要编译器自动加上*去解引用什么的,不是多此一举吗
展开
 我来答
White_MouseYBZ
2014-09-07 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6996万
展开全部
你的疑问很有意义。函数名本身就是指针,再声明一个指针指向这个名字,实际上这两个指针就相等了。因为指针相等的意义之一就是指向同一个地方,它们都指向了函数入口处,所以用p()的形式调用就很好了。用(*p)()形式调用完全是为了对“函数指针”的称呼自圆其说——既然指针p指向了名为x的函数,那*p是x才对。其实质却不是这样,而是指针和函数名都指向了这个函数的入口地址,所以编译器不会加一个什么*。有意思的是,如果指针p指向了函数x,那么用p()和(*p)()调用x函数是等价的还好理解,更甚的是(**p)()调用、用(***p)()调用都是一样的,甚至写上200个*也无妨,这足以说明,编译器把函数指针p和*p都是解释为p的。
追问
你好,但是我在一些帖子搜到不加*的是隐式解引用,编译器会自动加上*去做间接调用
而且C标准认为p()是(*p)()的简写,既然是简写,那是不是应该做的事情是一样的呢
追答
当然做的事情是一样的。了解实质就行了,就是指针和函数名都指向了这个函数。在给函数指针赋值时,用不用&效果也是一样的:p=f和p=&f都一样,我的理解都是为了一种理论完善,没有实质意义。其实函数指针和数组指针对照理解就好些了,如有int a[10],*p=a;,常说p指向了a,其实是错误的,实质是p=a,即p和a都指向了a[0],其值都是&a[0]。函数指针与些非常类似。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式