关于 函数指针和函数名 例子的疑难解答
#include "iostream.h"
void show(int i)
{
cout<
按道理说,既然把把值给了函数指针,那么函数值真指向的内存地址,应该就是函数名的值(据说函数名就是函数的首地址)。
但是在VC下DEBUG,看的内存内容怎么也对不上号;
再加上上述4个语句,把我彻底雷晕了。
答:
#include "iostream.h"
void show(int i)
{
cout<<i<<endl;
}
void main()
{
void (*func)(int); //函数指针
func=show;
func(1);
func=show;
(*func)(2);
func=&show;
func(3);
func=&show;
(*func)(4);
cout << &show << endl;
cout << func << endl;
}
1
2
3
4
0x00401014
0x00401014
Press any key to continue
不是很明白LZ想说什么。。。 show的地址和func的值一样的呀~
答:
你要看release版的才是真正的函数内容
debug版的函数名代表的地址处是一个jmp到实际内容的指令
对于这种情况,由于历史与逻辑的缘故
在C++中 func=show; func(1);和func=show; (*func)(2);两种情况
一种学派认为func是函数指针,则*func就是函数
因此(*func)(2)这样调用。另一种学派函数名是指向函数的指针,指向函数的指针的行为
则与函数名相同,所以func(2)也可以。虽然在逻辑上是冲突的,但是C++进行了折中。
所以两种都是正确的
show前为何还要加地址符号
没有必要加,但是避免了隐性类型转换,可能是个好习惯。
其实fun,*fun,**fun也是一样的。
我要说的是:
第一、
用cout<<show<<endl cout<<func<<endl 输出两个地址值,确实内容一样。
但是在调试运行的时候查看show和func的值,有一点小偏差;
后来问老师才明白,程序生成了两个show(),准确的说其中一个是函数名处理过了的show();
至于为什么要多出有别名的那一个,我也不清楚;我只知道dll的导出函数如果不加处理的话输出的话,导出的函数名也会处理一下。
第二、在调试运行的时候,把show拖入内存显示的板块,发现左边是show指向的地址,右边是show指向地址的内容;这一点和数组名一样,把数组名拖进去也是这么显示的;
而正常情况下,左边应该显示的是指针本身的地址,右边才是指针指向的地址。
这一点非常不明白,难道数组名和函数名是特例?
希望大家指点指点!!