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

C++ 为什么我们可以取消对函数指针的引用?,c++,c,pointers,C++,C,Pointers,很明显,正如你所知道的,我对指针是新手。我来自Java,没有指针 我还是不明白为什么我们可以取消对函数指针的引用?我们可以取消对int指针的引用,因为我们知道int是4字节,但是我们不能取消对空指针的引用,因为我们不知道它的长度。对于函数指针,虽然我们知道返回值的数据类型(长度)和函数的参数,但我们不知道函数在文本中的长度,因此我们如何知道函数的长度以便可以取消引用它?好问题。我以前也有同样的问题。函数点的大小与任何其他指针的大小相同。唯一的区别是函数指针指向内存的文本部分。每次进行方法调用时,

很明显,正如你所知道的,我对指针是新手。我来自Java,没有指针


我还是不明白为什么我们可以取消对函数指针的引用?我们可以取消对int指针的引用,因为我们知道int是4字节,但是我们不能取消对空指针的引用,因为我们不知道它的长度。对于函数指针,虽然我们知道返回值的数据类型(长度)和函数的参数,但我们不知道函数在文本中的长度,因此我们如何知道函数的长度以便可以取消引用它?

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

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

当你取消引用它时,你就把它给了一个盲人,他走到那个地方。这个盲人不知道那里是否有坑、房子、河流或购物中心,除非你告诉他们:告诉他们是指针的类型

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

当你知道一个指针指向一个
int
时,你是在告诉盲人在该地址期待一个
int
。所以他们走到那里,与那里的任何东西进行交互,就好像那是一个
int

当你知道一个指针是一个函数指针,你去引用它并调用它时,盲人不需要知道这个函数有多大:他们只需要知道它从哪里开始。功能有点像游乐园游乐设施——你坐上它们,然后在某个时候它们会把你踢出去。他们几乎总是在你上车的地方把你踢开,口袋里掉出来的任何东西都会让你更轻,还带着一张你乘坐的纪念照片(回报值)。(具体情况取决于呼叫约定)

现在,功能的签名很重要——它告诉你乘坐的乘客希望携带什么。返回值类型很重要,因为这会告诉您为您的车的纪念图片带来什么形状的盒子。但函数的确切大小并不重要


当然,我们可以继续讨论成员函数指针、近指针和远指针、引用以及其他更深奥的东西。

在抽象中,“取消引用”指针意味着将其转换回指向的对象。对于具体类型,对象的大小是相关的,但这取决于类型本身,而不是指针。当您调用函数时,调用代码当然不需要知道函数有多大,因此当您取消引用函数指针时,您也不需要知道它的长度。

但是我们不知道它的长度,就像void指针一样,我们知道它的地址,但我们真的不知道我们将读取多少字节……您不需要知道。您只需要知道地址的长度是4字节。我们不是用指针保存整个数据结构,而是这个对象的地址。该函数是由编译器预加载的,您只需要拥有地址,以便程序知道在代码中的特定位置加载哪个函数。所以从技术上讲,你“确实”知道它占用了多少内存。希望这有助于保持清晰,我想我现在已经理解了
函数点与任何其他指针的大小相同。
是完全错误的,没有保证,void*与任何函数都不兼容pointer@DieterL准确地说:在ISO C++中没有这样的保证,虽然POSIX和Windows中都有,但这个问题可能会有所帮助。解释当您尝试以正常方式(即使用
*
)取消对函数指针的引用时,函数指针会发生什么情况。我发现您对函数指针的长度有点困惑。请参阅下面的主题,以获得更好的说明“尊重”!=“引用”注意到,在C++中,<代码> int >代码不一定是四字节。它至少是16位,在正常情况下是两个字节,尽管16位整数和正常值在当今的情况下并不太协调。不,问题不在于函数指针的长度,而是它指向的函数的长度。哇,喜欢这个答案太棒了。为修改其参数的函数添加类比:p@almado这种类比最终被打破了。但是卡尼可以在你的口袋里搜寻,找到上面有地址的纸条,并在你乘车时将数据传送给他们。当然,快递员是瞎的。