zoukankan      html  css  js  c++  java
  • C/C++函数及函数指针

      1、main函数的参数

    extern char **environ;
    
    int main(int argc, char **argv)
    {
        // 这里忽略对argc值的检查
        printf("argv: %p, %s
    ", argv[0], argv[0]);
        printf("argv: %p, %s
    ", argv[1], argv[1]);
        printf("argv: %p, %s
    ", argv[2], argv[2]);
    
        char *p = environ[0];
        char *q = environ[1];
        printf("env: %p, %s
    ", p, p);
        printf("env: %p, %s
    ", q, q);
    
        return 0;
    }

      编译以上代码,并运行./a.out hello world,得到以下输出:

    argv: 0xbfaa438f, ./a.out
    argv: 0xbfaa4397, hello
    argv: 0xbfaa439d, world
    env: 0xbfaa43a3, XDG_VTNR=7
    env: 0xbfaa43ae, XDG_SESSION_ID=c2

      可知main函数的参数和environ的内存布局如下:

      

      argv之后的部分是环境变量,可参照printenv(打印指定环境变量的值,或所有环境变量的名字和值)

      

      2、函数指针

    void func(int i, const char *ch)
    {
        cout << i << "	" << ch << endl;
    }
    
    // 第三个参数(函数类型)自动转换为函数指针类型
    // 等效于void foo(int a, int b, void (* func)(int i, const char *ch))
    void foo(int a, int b, void func(int i, const char *ch))
    {
        cout << a << "	" << b << endl;
        func(3, "hello");
    }
    
    // 等效于void (* bar(int a))(int, const char *) {...}
    // 返回值可以定义为函数指针类型,但不能为函数类型,如这样是错误的:
    // typedef void pf(int, const char *); pf bar(int a) {...}
    typedef void(* func_ptr)(int, const char *);
    func_ptr bar(int a)
    {
        cout << a << endl;
        return &func;
    }
    
    int main()
    {
        foo(1, 2, func);
        bar(4)(5, "world");
    
        // 在引用函数名但又没有调用该函数时,函数名将被自动解释为函数指针
        // 等效于void (* func_ptr)(int, const char *) = &func;
        void (* func_ptr)(int, const char *) = func;
    
        // 函数指针可用于调用它所指向的函数,不需要使用解引用操作符(隐式解引用)
        // 等效于(*func_ptr)(3, "hello");
        (func_ptr)(3, "hello");
    
        // 使用typedef简化函数指针类型的使用
        typedef void(* func_ptr)(int, const char *);
        func_ptr fp = &func;
    
        // 类似地,函数也可以使用typedef
        typedef void func_type(int, const char *);
        func_type *fp = func;
        func_type f1;
    
        return 0;
    }

      函数指针的应用:如回调函数。

      参考资料:

      《C++ Primer》

    不断学习中。。。

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/hanerfan/p/3385272.html
Copyright © 2011-2022 走看看