zoukankan      html  css  js  c++  java
  • 关于 函数指针和函数名 例子的疑难解答

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


  • 相关阅读:
    如何快速查看archlinux pacman 软件记录?
    如何快速判断检查主机ip端口是否存活?
    如何在不清楚有哪些tag的情况下拉取docker镜像?
    如何使用docker版Openresty测试框架Test::Nginx进行测试?
    .net mvc4 使用 System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bund
    zen coding de 一些快捷功能
    C# Xpath
    一个SQL SERVER查询分析器非常好用的工具
    探索MSSQL执行计划
    博客园武林人士
  • 原文地址:https://www.cnblogs.com/lanqiu5ge/p/9472247.html
Copyright © 2011-2022 走看看