V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zynlp
V2EX  ›  C

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

  •  1
     
  •   zynlp · Sep 19, 2018 · 2875 views
    This topic created in 2788 days ago, the information mentioned may be changed or developed.
    • 结果
      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 replies    2018-09-19 12:44:10 +08:00
    ipoh
        1
    ipoh  
       Sep 19, 2018
    是这样的
    sbw
        2
    sbw  
       Sep 19, 2018
    int a[]; a 和 &a 也一样,标准规定的。
    co3site
        3
    co3site  
       Sep 19, 2018 via Android
    正如楼上所说,数组和函数直接用名字,本质是首地址
    zynlp
        4
    zynlp  
    OP
       Sep 19, 2018 via iPhone
    @co3site 那为什么在参数声明的时候前面加不加*号也是一样的
    kljsandjb
        5
    kljsandjb  
       Sep 19, 2018 via iPhone
    你 foo 和 wtf 的定义的函数指针其实一样,加*只是显式地说明这是函数指针而已,规定就是如此,就类似数组名是首地址一样,你可以用一个额外的指针变量去引用它,只是随你罢了,但是数组的情况更 tricky 一点点
    co3site
        6
    co3site  
       Sep 19, 2018
    @zynlp 本质都是传进去指针,相对来说定义是指针类型更加灵活(邪恶),你甚至还可以把任意内存地址转型成目标的函数指针类型传进去
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   969 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 22:20 · PVG 06:20 · LAX 15:20 · JFK 18:20
    ♥ Do have faith in what you're doing.