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》

不断学习中。。。

原文地址:https://www.cnblogs.com/hanerfan/p/3385272.html