显然,我是一个指针的新手。我来自没有指针的Java。
我仍然不明白为什么我们可以解引用函数指针?我们可以解引用int指针,因为我们知道int是4个字节,但是我们不能解引用void指针,因为我们不知道它的长度。对于一个函数指针,虽然我们知道函数的返回值和参数的数据类型(长度),但我们不知道函数在文本中的长度,那么我们怎么知道函数的长度以便我们可以解引用它呢?
指针相当于一张盲文写有街道地址的纸条。
当您对其进行引用时,您将其交给一个盲人走到那个地方。除非告诉他们,否则这位盲人不知道那里是否有坑、房子、河流或购物中心:告诉他们是指针的类型。
几乎所有地址都具有相同的长度。
当您知道指针是指向int
时,您就是在告诉那位盲人在该地址处期望找到一个int
。所以他们走到那里并与任何东西交互,就好像它是一个int
。
当您知道指针是一个函数指针,并且你对其进行了引用并调用它,那么这位盲人就不需要知道函数有多大:他只需要知道它从哪里开始。函数有点像游乐园里的设施——你上了车,然后在某个时刻他们让你下车。几乎总是让你从你上车的地方下车,少了口袋里掉落的东西,还带着一张纪念照片(返回值)。 (发生的确切情况将取决于调用约定)
现在,函数的签名很重要——它告诉您游乐设施期望乘客携带什么。返回值类型也很重要,因为它告诉您纪念照片的形状。但是函数的确切大小并不重要。
当然,我们还可以谈论成员函数指针、近指针、远指针、引用和其他更玄奥的事物。
很好的问题。在此之前我也有同样的疑问。函数指针与其他指针一样大,唯一的区别在于函数指针指向内存中的文本部分。每次进行方法调用时,计算机会解引用作为方法名称的函数指针。
*
)取消引用函数指针时会发生什么。 - Bhargavint
不一定是四个字节。在正常情况下,它至少是16位,即两个字节,尽管16位的整数和正常情况现在并不太搭配。 - chrisBase *
。 - MSalters