试图理解C中的函数指针

4 c pointers function

我正在尝试理解函数指针并且正在捣乱.我已经看到了K&R中的排序示例以及其他一些类似的示例.我的主要问题是计算机实际上在做什么.我创建了一个非常简单的程序来尝试查看基础知识.请参阅以下内容:

#include <stdio.h>

int func0(int*,int*);
int func1(int*,int*);

int main(){

    int i = 1;
    myfunc(34,23,(int(*)(void*,void*))(i==1?func0:func1));//34 and 23 are arbitrary inputs



}

void myfunc(int x, int y, int(*somefunc)(void *, void *)){

    int *xx =&x;
    int *yy=&y;

    printf("%i",somefunc(xx,yy));


}

int func0(int *x, int *y){

    return (*x)*(*y);

}

int func1(int *x, int *y){

    return *x+*y;
} 
Run Code Online (Sandbox Code Playgroud)

程序要么根据某个变量相乘或相加两个数字(i在主函数中 - 应该是主要的参数).fun0乘以两个整数,func1将它们相加.

我知道这个例子很简单,但是如何传递一个函数指针,可以在函数myfunc中放入一个条件?即在myfunc中有以下内容:

if(i == 1)printf("%i",func0(xx,yy));

else printf("%i",func1(xx,yy));
Run Code Online (Sandbox Code Playgroud)

如果我这样做,结果将是相同的但不使用函数指针.

vip*_*ipw 10

您对函数指针如何工作的理解很好.您没有看到的是软件系统如何从使用函数指针中受益.在使用不了解其他组件的组件时,它们变得很重要.

qsort()就是一个很好的例子.qsort将允许您对任何数组进行排序,并且实际上并不知道组成数组的内容.因此,如果你有一个结构数组,或更可能指向结构的指针,你将不得不提供一个可以比较结构的函数.

struct foo {
  char * name;
  int magnitude;
  int something;
};

int cmp_foo(const void *_p1, const void *_p2)
{
  p1 = (struct foo*)_p1;
  p2 = (struct foo*)_p2;

  return p1->magnitude - p2->magnitude;
}

struct foo ** foos;
// init 10 foo structures...

qsort(foos, 10, sizeof(foo *), cmp_foo);
Run Code Online (Sandbox Code Playgroud)

然后将根据幅度字段对foos数组进行排序.

如您所见,这允许您对任何类型使用qsort - 您只需提供比较功能.

函数指针的另一个常见用法是回调,例如在GUI编程中.如果希望在单击按钮时调用函数,则在设置按钮时将提供指向GUI库的函数指针.