为什么我们可以取消引用函数指针?

use*_*627 6 c c++ pointers

显然,正如你所知,我是新手.我来自Java没有指针.

我仍然不明白为什么我们可以取消引用一个函数指针?我们可以取消引用一个int指针,因为我们知道一个int是4个字节,但我们不能取消引用一个void指针,因为我们不知道它的长度.对于函数指针,虽然我们知道返回值的数据类型(长度)和函数的参数,但是我们不知道函数在文本中会有多长,所以我们怎么知道函数的长度呢?我们可以取消引用它吗?

Yak*_*ont 19

指针相当于一张纸,上面写着街道地址.

当你取消引用它时,你把它交给一个走到这个地方的盲人.这个盲人不知道那里是否有坑,房子,河流或商场,除非你告诉他们:告诉他们是指针的类型.

几乎所有地址的长度都相同.

当你知道一个指针指向a时int,你告诉盲人期望int在那个地址.所以他们走到那里并与那里的任何东西互动,好像它是一样的int.

当你知道一个指针是一个函数指针,然后你取消引用它并调用它时,盲人不需要知道函数的大小:它们只需要知道它的起始位置.功能有点像游乐园游乐设施 - 你接触它们,然后在某些时候他们会把你踢掉.几乎总是他们会把你从你所在的地方踢开,从你的口袋里掏出来的东西更轻,并带上你的骑行纪念照片(返回价值).(具体细节将取决于调用约定)

现在,功能的签名很重要 - 它告诉你乘客期望乘客乘坐什么.返回值类型很重要,因为它可以告诉您为您乘坐的纪念照片带来什么样的盒子形状.但是功能的确切大小并不重要.

当然,我们可以继续讨论成员函数指针,远近指针,引用和其他更深奥的野兽.


小智 2

好问题。我之前也有同样的疑问。函数点的大小与任何其他指针的大小相同。唯一的区别是函数指针指向内存的文本部分。每次进行方法调用时,计算机都会取消引用作为方法名称的函数指针。