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》

    不断学习中。。。

  • 相关阅读:
    Delphi代码获取网卡物理地址三种方法 本文来自Delphi之窗,原文地址:http://www.52delphi.com...
    SQL SERVER 中实现公历到农历的转换
    cxgrid相同列合并显示
    rzCheckList.ItemChecked[Index]就可以判断指定节点地状态.
    为什么PING域名得到IP与实际公网IP不符
    如何让sql server2005和sql server2000共存安装在同一机器上
    如何编译通过 Raize 5.3 中的 RzBorder.pas
    u6升级到u890的过程
    技术部门到底该如何管理才能“和谐”
    在CXGRID中如何让字段能以0.00的格式显示
  • 原文地址:https://www.cnblogs.com/hanerfan/p/3385272.html
Copyright © 2011-2022 走看看