C ++中的函数指针歧义

时间:2017-01-10 19:48:09

标签: c++ function pointers function-pointers

我有两个问题:

Q1)函数名称本身是指针??

如果它们是指针,那么它们中存储了哪些值?

如果他们不是指针,那么, 它们是什么以及它们中存储的值是什么?

如果我们认为函数名是指针。然后:

void display(){...}

int main ()
{ 
    void (*p)();

    **p=display; //Works (justified**, because we are assigning one pointer into another)

    **p=&display; //Works (Not justified** If function name is a pointer (let say type*) , then &display is of datatype : type**. Then how can we assign type** (i.e. &display) into type * (i.e. p)??)

    **p=*display; //Works (Not justified** If function name is a pointer ( type *) ,then, how can we assign type (i.e. *display) into type * (i.e. p) ?? )
}

再次,

cout<<display<<";"<<&display<<";"<<*display;

打印类似:

0x1234; 0x1234; 0x1234

[1234就是例如]

[OMG!这怎么可能?如何指向指针的地址,指向的地址和指向地址的值都相同?]

Q2)用户定义的函数指针中存储了什么值?

考虑一下这个例子:

void display(){...}

int main()
{
    void (*f)();

    f=display;

    f=*f; // Why does it work?? How can we assign type (i.e. *f ) into type * (i.e.  f). 

    cout<<f<<";"<<&f<<";"<<*f;

    //Prints something like :

    0x1234;0x6789;0x1234
}

[前两个输出是合理的...... 但是指针(它指向的地址)中的值如何等于存储在指向地址中的值?]

再次:

f=*********f; // How can this work?

我在网上搜索了它,但所有可用的信息都是关于使用和创建函数指针的示例代码。他们都没有说出他们是什么或者他们与普通指针的区别。

所以我必须遗漏一些非常基本的东西。请指出我缺少的东西。 (抱歉我的初学者是无知的。)

1 个答案:

答案 0 :(得分:10)

函数名称本身是指针吗?

没有。但是,在某些上下文中,函数可以自动转换为指向函数的指针。该标准在第4.3段中说明:

  

函数类型T的左值可以转换为“指向T的指针”的prvalue。结果是指向函数的指针。

(函数名称指定左值,但可以有其他函数类型左值)。

在你的例子中

p = display;
p = *p;

正是这种自动转换。 display*p是函数类型的左值,并且在需要时,它们将以静默方式自动转换为指向函数的类型。

p = *display; 

此处转换发生两次:第一个display转换为*运算符的指针,然后将其解除引用,然后再次转换为指针{ {1}}运营商。

=

此处,cout << display << ";" << &display << ";" << *display; 转换为display的指针; operator <<已经是指针,因为&display是一个普通的地址获取运算符;并且&转换为*display的指针,而operator <<内的display转换为operator *的指针。

f = *********f;

此表达式中有许多此类转换。自己数数吧!