关于 函数指针和函数名 例子的疑难解答
来源:互联网 发布:原单包淘宝店铺 编辑:程序博客网 时间:2024/06/07 20:43
问:
按道理说,既然把把值给了函数指针,那么函数值真指向的内存地址,应该就是函数名的值(据说函数名就是函数的首地址)。但是在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指向地址的内容;这一点和数组名一样,把数组名拖进去也是这么显示的;
而正常情况下,左边应该显示的是指针本身的地址,右边才是指针指向的地址。
这一点非常不明白,难道数组名和函数名是特例?
希望大家指点指点!!
0 0
- 关于 函数指针和函数名 例子的疑难解答
- 关于函数名和函数指针的理解
- 函数名和指针的关系
- 关于函数名与函数指针的一点思考
- 指针函数和函数指针的使用例子
- 关于函数名与函数指针
- 关于函数名与函数指针
- 关于函数指针的&和*
- 函数名 和 自己定义的普通函数指针 辨析
- 关于接口、变量、指针、函数名和引用之间的联系
- 函数名、函数指针
- 关于指针函数和函数指针的问题(一)
- 关于函数指针和指针函数的理论知识
- 关于成员函数指针和普通函数指针的转换
- 关于函数指针和指针函数的总结
- 关于函数指针和指针函数的分析
- VC++ 关于函数指针和指针函数的简单介绍
- 关于函数传引用和传指针的见解,以线性表为例子
- SQL Server 触发器
- C++primer plus第六版课后编程题答案16.7
- 删除已经编译好的内核
- Spring几种常用注解
- 堆和栈的区别
- 关于 函数指针和函数名 例子的疑难解答
- Android 4.0 事件输入(Event Input)系统
- 《算法导论》笔记 第17章 17.3 势能方法
- 查询数据库所有表名
- OGNL表达上的“%,#,$”
- Android 4.0中按键的处理流程
- Android 中input event的分析
- 结构体
- C++中动态申请二维数组