显然你可以说,我是新手。我来自Java,没有任何指针。
我仍然不明白为什么我们可以取消引用函数指针?我们可以取消引用一个int指针,因为我们知道一个int是4个字节,但我们不能取消引用一个void指针,因为我们不知道它的长度。对于函数指针,虽然我们知道返回值的数据类型(长度)和函数的参数,但是我们不知道函数在文本中会有多长,所以我们怎么知道函数的长度呢?我们可以取消引用它吗?
答案 0 :(得分:18)
指针相当于一张纸上写有街道地址的纸张。
当你取消引用它时,你把它交给一个走到这个地方的盲人。这个盲人不知道那里是否有坑,房子,河流或商场,除非你告诉他们:告诉他们是指针的类型。
几乎所有地址的长度都相同。
当您知道指针指向int
时,您告诉盲人期望该地址int
。所以他们走到那里并与那里的任何东西互动,好像它是int
。
当你知道一个指针是一个函数指针,并且你取消引用它并将其称为时,盲人并不需要知道函数有多大:他们只需要知道开始的地方。功能有点像游乐园游乐设施 - 你接触它们,然后在某些时候他们会把你踢掉。几乎总是他们会把你从你所在的地方踢开,从你的口袋里掏出来的东西更轻,并带上你的骑行纪念照片(返回价值)。 (具体的细节将取决于调用约定)
现在,这个功能的签名很重要 - 它告诉你乘客期望乘客乘坐什么。返回值类型很重要,因为它可以告诉您为您乘坐的纪念照片带来什么样的盒子形状。但功能的确切大小并不重要。
当然,我们可以继续讨论成员函数指针,远近指针,引用和其他更深奥的野兽。
答案 1 :(得分:1)
好问题。我之前有同样的问题。功能点与任何其他指针的大小相同。唯一的区别是函数指针指向内存的文本部分。每次进行方法调用时,计算机都会取消引用作为方法名称的函数指针。
答案 2 :(得分:0)
在摘要中,“解除引用”指针意味着将其转换回指向的东西。对于具体类型,事物的大小是相关的,但这是由类型本身决定的,而不是由指针决定的。当你调用一个函数时,调用代码当然不需要知道函数有多大,所以当你取消引用一个函数指针时你也不需要知道。