C++中的函数指针歧义
Function Pointer ambiguity in C++
我有两个问题:
问题 1)函数名称本身是指针吗?
如果它们是指针,那么它们存储了什么值?
否则,如果它们不是指针,那么, 它们是什么,其中存储了哪些值?
如果我们认为函数名称是指针。然后:
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段中说:
函数类型 T的左值可以转换为类型为"指向 T 的指针"的 prvalue。结果是指向函数的指针。
(函数名称指定左值,但可以有函数类型的其他左值)。
在您的示例中
p = display;
p = *p;
正是这种自动转换。display
和*p
是函数类型的左值,在需要时,它们会自动静默转换为指向函数的指针类型。
p = *display;
此处的转换发生两次:首先display
转换为*
运算符的指针,然后取消引用,然后再次转换为=
运算符的指针。
cout << display << ";" << &display << ";" << *display;
在这里,display
被转换为operator <<
的指针;&display
已经是一个指针,因为&
是一个普通的地址获取运算符;并且*display
被转换为operator <<
的指针,而在其内部display
被转换为operator *
的指针。
f = *********f;
此表达式中有许多此类转换。自己数一数!
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 函数调用带有指针、引用和常量引用参数的歧义
- C++中的函数指针歧义
- 在隐式转换后的智能指针上删除函数调用中的歧义
- 消除函数指针和指向类实例的指针之间的歧义
- g++和clang++-删除由重载转换运算符歧义获取的指针
- 解决无符号长/指针的歧义
- 消除作为模板参数传递的重载成员函数指针的歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 在将派生类指针转换为基类时,基类有歧义
- 模板化形参的函数指针歧义
- 外部"C"、重载和函数指针可能存在歧义
- 标准中关于超出范围指针的未定义行为的歧义