【问题标题】:For function pointer "fptr",why is value of "fptr" and *fptr same?What *fptr even mean?I only knew (*fptr)() or fptr() [duplicate]对于函数指针“fptr”,为什么“fptr”和 *fptr 的值相同?*fptr 甚至是什么意思?我只知道 (*fptr)() 或 fptr() [重复]
【发布时间】:2013-05-10 22:21:44
【问题描述】:

就这种行为而言,为什么function pointer 的行为类似于array pointer?我的意思是,让我们从数组list[] 的情况开始,我们将考虑&listlist

 char name[5]= "Eric",(*aptr)[5]=&name;
 printf("%p,%p",*aptr,name); //BOTH ARE NUMERICALLY SAME

我们也可以将数组元素称为(*aptr)[1](*aptr)[2] 等。我明白这里发生了什么。

但是为什么函数同样适用呢?毕竟“函数”本身并不是一个由类似元素组成的连续内存块,就像数组一样。考虑一下。

假设fptr是我程序中的函数指针。为什么fptr*fptr在打印时给出相同的值?*fptr是什么意思?我只知道我们可以调用一个函数使用它的指针为(*fptr)()fptr(),那么单独的*fptr 是什么?

#include<stdio.h>

void foo(){};

int main(void)
{
void (*fptr)()=foo;
printf("%p,%p",fptr,*fptr);

}

结果- 00401318 00401318

【问题讨论】:

  • 函数可以隐式转换为函数指针,如果取消引用函数,它会再次转换为函数指针。然后再次。再说一次......你也可以毫无问题地做****************fptr

标签: c function-pointers


【解决方案1】:

指针是指向内存位置的。一个函数在内存中并且有一个起始地址。您可以很好地取消引用函数名(它是一个指针)以获取该地址处的函数。

来自 Stephen Prata “Cpp Primer Plus


历史与逻辑的神圣句法!


pf 和 (*pf) 如何等效? 一个学派认为,因为 pf 是指向 函数,*pf 是一个函数;因此,您应该使用 (*pf)() 作为 函数调用。 第二所学校坚持认为,因为 function 是指向该函数的指针,指向该函数的指针 应该像函数名一样;因此你应该使用 pf() 作为 函数调用。 C++ 采取妥协的观点,认为这两种形式都是 正确的,或者至少可以被允许,即使它们在逻辑上是 彼此不一致。在你判断妥协之前 严厉地,反映出持有不合逻辑观点的能力 自洽是人类心理过程的标志。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多