none
函數指針 的問題 RRS feed

  • 问题

  • 我是初學者, 我不明白函數指針有什麼用, 為什麼要通過指針去調用函數, 我直接用函數名調用函數不可以嗎?
    2012年11月12日 6:37

答案

  • 用于回调函数,或者设计的一种方法。比如异步的网络连接调用,你就要把你的处理函数交给系统,系统会在有网络消息的时候,通过函数指针,调用你的函数。再比如多线程中的函数调用,往往都是通过异步调用回调函数实现的。另外也可以通过函数指针自己实现函数的跳转表。比如定义一组格式相同的函数,然后把函数指针保存到一个数组里,根据数组编号就可以访问相应功能的函数。偷偷告诉你,switch 的一种优化就是这么做的~

    麻烦把正确答案设为解答。

    2012年11月12日 7:10
    版主
  • 函数指针主要用来支持回调函数。

    如果你直接用函数名调用函数,那这个调用在编译时就唯一确定了。有些情况下,编译的时候不知道该调用哪个函数,这时就需要函数指针。比如 CRT 函数 qsort,

    void qsort(
       void* base,
       size_t num,
       size_t width,
       int (__cdecl* compare)(const void*, const void*)
    );
    qsort 需要用户定义的比较大小函数。由于这个比较函数是用户定义的,在 qsort 的函数体内不可能按函数名调用它,因为此刻它还不存在。这就只能使用函数指针确定函数原型以正确编译,函数的具体地址在用户调用 qsort 时传入。
    2012年11月12日 9:00

全部回复

  • 用于回调函数,或者设计的一种方法。比如异步的网络连接调用,你就要把你的处理函数交给系统,系统会在有网络消息的时候,通过函数指针,调用你的函数。再比如多线程中的函数调用,往往都是通过异步调用回调函数实现的。另外也可以通过函数指针自己实现函数的跳转表。比如定义一组格式相同的函数,然后把函数指针保存到一个数组里,根据数组编号就可以访问相应功能的函数。偷偷告诉你,switch 的一种优化就是这么做的~

    麻烦把正确答案设为解答。

    2012年11月12日 7:10
    版主
  • 函数指针主要用来支持回调函数。

    如果你直接用函数名调用函数,那这个调用在编译时就唯一确定了。有些情况下,编译的时候不知道该调用哪个函数,这时就需要函数指针。比如 CRT 函数 qsort,

    void qsort(
       void* base,
       size_t num,
       size_t width,
       int (__cdecl* compare)(const void*, const void*)
    );
    qsort 需要用户定义的比较大小函数。由于这个比较函数是用户定义的,在 qsort 的函数体内不可能按函数名调用它,因为此刻它还不存在。这就只能使用函数指针确定函数原型以正确编译,函数的具体地址在用户调用 qsort 时传入。
    2012年11月12日 9:00