V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zynlp
V2EX  ›  C

我又来了,函数指针的问题

  •  1
     
  •   zynlp · 2018-09-19 11:04:53 +08:00 · 2357 次点击
    这是一个创建于 2287 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 结果
      foo: 0x4006e1
      f: 1
      foo: 0x4006e1
      f: 2
      wtf: 0x4006e1
      f: 3
      wtf: 0x4006e1
      f: 4

    所以函数的前面加不加&和*都一样吗?WTF

    #include <iostream>
    
    using namespace std;
    
    void foo(int i, void(f)(int)){
        printf("foo: %p\n", f);
        f(i);
    }
    
    void wtf(int i, void(*f)(int)){
        printf("wtf: %p\n", f);
        f(i);
    }
    
    void f(int i){
        printf("f: %d\n", i);
    }
    
    int main(int argc, char* argv[]){
        foo(1, f);
        foo(2, &f);
    
        wtf(3, f);
        wtf(4, &f);
        return 0;
    }
    
    6 条回复    2018-09-19 12:44:10 +08:00
    ipoh
        1
    ipoh  
       2018-09-19 11:17:31 +08:00
    是这样的
    sbw
        2
    sbw  
       2018-09-19 11:40:53 +08:00
    int a[]; a 和 &a 也一样,标准规定的。
    co3site
        3
    co3site  
       2018-09-19 11:50:00 +08:00 via Android
    正如楼上所说,数组和函数直接用名字,本质是首地址
    zynlp
        4
    zynlp  
    OP
       2018-09-19 12:03:04 +08:00 via iPhone
    @co3site 那为什么在参数声明的时候前面加不加*号也是一样的
    kljsandjb
        5
    kljsandjb  
       2018-09-19 12:31:15 +08:00 via iPhone
    你 foo 和 wtf 的定义的函数指针其实一样,加*只是显式地说明这是函数指针而已,规定就是如此,就类似数组名是首地址一样,你可以用一个额外的指针变量去引用它,只是随你罢了,但是数组的情况更 tricky 一点点
    co3site
        6
    co3site  
       2018-09-19 12:44:10 +08:00
    @zynlp 本质都是传进去指针,相对来说定义是指针类型更加灵活(邪恶),你甚至还可以把任意内存地址转型成目标的函数指针类型传进去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3335 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.