关于 函数指针和函数名 例子的疑难解答

问:

#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指向地址的内容;这一点和数组名一样,把数组名拖进去也是这么显示的;
而正常情况下,左边应该显示的是指针本身的地址,右边才是指针指向的地址。
这一点非常不明白,难道数组名和函数名是特例?
希望大家指点指点!!


posted @ 2014-04-28 19:56  lanqiu5ge  阅读(257)  评论(0编辑  收藏  举报