C++ 为什么函数指针都有相同的值?
例如:C++ 为什么函数指针都有相同的值?,c++,function-pointers,C++,Function Pointers,例如: using namespace std; #include <iostream> void funcOne() { } void funcTwo( int x ) { } int main() { void (*ptrOne)() = funcOne; cout << ptrOne << endl; //prints 1 void (*ptrTwo)( int x ) = funcTwo; cout <<
using namespace std;
#include <iostream>
void funcOne() {
}
void funcTwo( int x ) {
}
int main() {
void (*ptrOne)() = funcOne;
cout << ptrOne << endl; //prints 1
void (*ptrTwo)( int x ) = funcTwo;
cout << ptrTwo << endl; //prints 1
int (*ptrMain)() = main;
cout << ptrMain << endl; //prints 1
}
使用名称空间std;
#包括
void funcOne(){
}
void funcTwo(int x){
}
int main(){
void(*ptrOne)()=funcOne;
不能像这样使用它,否则它将转换为bool
类型
cout << reinterpret_cast<void*>(ptrOne) << endl;
cout试试这个:
void (*ptrOne)() = funcOne;
cout << reinterpret_cast<void*>(ptrOne) << endl;
void (*ptrTwo)( int x ) = funcTwo;
cout << reinterpret_cast<void*>(ptrTwo) << endl;
int (*ptrMain)() = main;
cout << reinterpret_cast<void*>(ptrMain) << endl;
void(*ptrOne)(=funcOne;
Cuth C++中的操作符重载增加了各种讨厌的复杂度(它让你也做了很棒的事情,但有时只是头痛)。
正如其他答案中所解释的,C++对函数指针进行了一些自动类型强制。如果你只使用好的OL’C风格>代码PrimTf<代码>,你应该得到你所期待的结果:
#include <cstdio>
// ...
printf("func1: %p\nfunc2: %p\n", funcOne, funcTwo);
#包括
// ...
printf(“func1:%p\nfunc2:%p\n”,funcOne,funcTwo);
函数指针不会隐式转换为void*
,这是运算符对我来说没有的。在MSV2012上,每次打印我都会得到:011A1230、011A122B、011A12F3。这些语句应该打印函数指针addresses@Borgleader哦,它为你打印了什么?也许这只是我的编译器或其他特定的东西比尔:为什么??<代码> CUT@ BLZ我的打印语句打印出指针的值,这些指针是函数的内存地址。请解释一下这是怎么回事。你想让我解释什么?重新解释我以前从来没有见过/听到过的。它应该被任何C++引用所覆盖。我不喜欢这样说,但是。这是一个非常基本的问题。为什么要将其转换为bool类型?可能会,但不会,因为它在使用MSVC2012时打印得很好。好吧,所以我至少知道这是我运行的环境特有的。谢谢。从技术上讲,这可能是一个类型错误,因为%p
需要void*
,所以您必须强制转换。on大多数实现都不会有什么不同,但这并不能改变这是一个类型错误的事实。@DietrichEpp-这是一个有趣的观点。合同确实声明它需要一个void*
,但由于它是一个varargs函数,所以无论如何都应该扔掉它。我认为许多现代编译器实际上会解析格式化字符串并为您做一些额外的检查,但这超出了C标准实际可以指定的任何范围。我将给您一个+1,以说明一个有趣的观点,但我不打算添加额外的强制转换,如果编译器遵守C标准,则编译器应该忽略这些强制转换。@DietrichEpp-实际上,根据,C标准没有甚至允许你把函数指针转换成<代码>空洞*//>类型。Potatoswatter的答案似乎也在C++标准中是这样的。Hey DaoWen,我尝试过,它说FunToin和Funt2没有在范围内声明。你是不是把PrTRON和PTR2放在函数参数中?@ KACYRAYE——我研究JAP。从高中一直到高中,我想说它实际上比POSIX格式字符串的更晦涩的选项更容易阅读!谢谢!所以问题是函数指针不会转换为空指针。这是否意味着所有其他类型的指针在与实际一起使用时都会隐式转换,在大声读出来之后好几次了,我完全理解。非常感谢!
cout << (ptrOne != NULL) << endl;
cout << true << endl;
#include <cstdio>
// ...
printf("func1: %p\nfunc2: %p\n", funcOne, funcTwo);