• 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》

    不断学习中。。。

  • 相关阅读:
    div 水平居中 内容居左
    net core 踩坑记录
    正向代理和反向代理
    NOIP2013 | 货车运输
    【转载】字符串Hash & 【题解】好文章
    cqyz oj | 帮助Jimmy | DAG图
    cqyz oj | 猜序列
    转载 | 原码, 反码, 补码 详解
    cqyz oj | 有线电视网
    cqyz oj | 罕见的秩序 | 拓扑排序
  • 原文地址:https://www.cnblogs.com/hanerfan/p/3385272.html
Copyright © 2020-2023  润新知