c++ - C++中的函数指针歧义

标签 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只是举例]

[天哪!这怎么可能?指针的地址、它指向的地址和指向地址的值怎么可能都相同?]

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?

我在网上搜索过,但所有可用的信息都是关于用法和创建函数指针的示例代码。它们都没有说明它们是什么或它们与普通指针有何不同。

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

最佳答案

函数名称本身是指针吗?

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

An lvalue of function type T can be converted to a prvalue of type “pointer to T.” The result is a pointer to the function.

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

在你的例子中

p = display;
p = *p;

就是有这种自动转换。 display*p是函数类型的左值,在需要时,它们会自动自动转换为指向函数的指针类型。

p = *display; 

此处转换发生两次:第一次display转换为 * 的指针运算符,然后它被取消引用,然后再次转换为 = 的指针运营商。

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

在这里,display转换为 operator << 的指针; &display已经是一个指针,因为 &是一个正常的地址获取运算符(operator);和 *display转换为 operator << 的指针在里面display转换为 operator * 的指针.

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

这个表达式中有很多这样的转换。自己数一数!

关于c++ - C++中的函数指针歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577136/

相关文章:

c++ - Doxygen 和长类名

javascript - 无法理解JS函数后面的参数

matlab - 如何在不使用嵌套函数的情况下求解 ODE?

c++ - 将 std::string 转换为 const char * 和函数调用

c++ - 特征未对齐断言

c++ - 如果我在这里和那里使用内联函数怎么办

c++ - 如何在 C++ 或 OpenCV SubMatrix 中的 2D 子 vector 上使用 OpenACC?

c - C 中字符串文字的 "Life-time"

C 随机树指针警告(有时会崩溃)

pointers - 结构成员的 Golang func 指针