功能指针和必要性

时间:2015-06-01 08:31:05

标签: c function-pointers

我非常有兴趣在C中破解细节。

功能指针:

据我所知,函数指针只不过是一个C变量,它将函数的地址指向普通的C变量。这样我们就可以使用指针来调用函数。

问题:

  1. 使用函数指针而不是单独使用函数的必要性是什么?
  2. 它会做正常功能不能做的高级事吗?

4 个答案:

答案 0 :(得分:1)

根据维基百科,“在计算机编程中,回调是对可执行代码或一段可执行代码的引用,它作为参数传递给其他代码。这允许较低级别的软件层调用更高级别层中定义的子例程(或函数)。“

  1. 在C中,回调是使用函数指针实现的。例如,See this link.

  2. 普通函数可以将另一个函数作为其参数之一吗?在这种意义上,回调是一个高级的东西,函数指针实现它们。

  3. 此外,还解释了另一个用例here

答案 1 :(得分:0)

差异和用例与指针与常规对象基本相同。您可以存储指向函数的指针,并在编译时/运行时配置将调用哪个函数。考虑作为最简单的示例qsort

void qsort( void *ptr, std::size_t count, std::size_t size,
            int (*comp)(const void *, const void *) );

有一个qsort实现,但您可以使用不同的条件订购相同的元素数组。

答案 2 :(得分:0)

如果你不知道,在编译时,使用什么函数,你可以使用函数指针来解决这个问题。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int (*fx)(int, int);
int one(int a, int b) { return a + b + 1; }
int two(int a, int b) { return a + b + 2; }
int three(int a, int b) { return a + b + 3; }
int four(int a, int b) { return a + b + 4; }

int main(void) {
    fx arfx[4] = {one, two, three, four};
    srand(time(0));
    for (int k = 0; k < 10; k++) {
        int n = rand() % 4; // 0, 1, 2, or 3
        int val = arfx[n](1, -1); // call one of functions in arfx
        printf("result is %d.\n", val);
    }
    return 0;
}

请参阅code running at ideone

答案 3 :(得分:0)

  

问题:

     

使用函数指针而不是使用函数指针的必要性是什么   单独的功能?

函数指针可以指向具有相同签名的各种函数,从而允许创建多态结构。它也可以作为回调 - 因此调用代码不需要知道可调用代码(可调用代码提供函数 - 依赖性反转原理)。

  

它会做任何正常功能的高级功能   做不到?

您可以提供一个函数指针作为对一段代码的回调,而这段代码不需要函数的名称来执行调用。其他地方提到的qsort就是一个很好的例子。