首页 > 编程笔记

C语言函数指针

在 C语言中,函数指针是指向函数的指针变量。它可以用来保存函数的地址,可以作为参数传递给其他函数,也可以作为返回值返回给调用者。

函数指针的声明方式类似于函数声明,只需要将函数名改为指针变量名,并在前面加上一个星号。

例如,如果有一个名为 add 的函数,它接受两个 int 类型的参数并返回它们的和,可以使用以下方式声明一个函数指针变量 p:
int (*p)(int, int);
这里的 (*p) 表示 p 是一个指向函数的指针变量,它可以指向返回类型为 int,参数列表为两个 int 类型的函数。

定义函数指针时,也可以直接指定它所指向的函数,例如:
int add(int x, int y) {
    return x + y;
}

int (*p)(int, int) = add;
这里的 p 就指向了 add 函数。

函数指针可以作为参数传递给其他函数,例如:
void call_func(int (*p)(int, int)) {
    int result = p(1, 2);
    printf("result is %d\n", result);
}

int add(int x, int y) {
    return x + y;
}

int main() {
    call_func(add);
    return 0;
}
这里的 call_func 函数接受一个函数指针作为参数,然后调用它,并将结果打印出来。在 main 函数中,调用 call_func 并将 add 函数作为参数传递进去,输出结果为:

result is 3

函数指针还可以作为返回值返回给调用者,例如:
int add(int x, int y) {
    return x + y;
}

int (*get_func())(int, int) {
    return add;
}

int main() {
    int (*p)(int, int) = get_func();
    int result = p(1, 2);
    printf("result is %d\n", result);
    return 0;
}
这里的 get_func 函数返回一个指向 add 函数的指针。在 main 函数中,调用 get_func 函数得到一个函数指针,并使用它调用 add 函数,输出结果为:

result is 3

需要注意的是,当函数指针作为参数或返回值时,需要指定函数的返回类型和参数列表,以便编译器能够正确地进行类型检查和函数调用。

另外,函数指针还可以用来实现回调函数。回调函数是一个通过函数指针传递给另一个函数的函数,用于在特定事件发生时被调用。

例如,假设有一个函数 process,它接受一个整数数组和数组长度作为参数,并对数组中的每个元素执行某些操作。现在希望让调用者在处理每个元素之前都能执行一些自定义的操作,可以通过函数指针实现回调函数,例如:
void process(int *arr, int len, void (*callback)(int *)) {
    for (int i = 0; i < len; i++) {
        if (callback != NULL) {
            callback(&arr[i]);
        }
        // do something with arr[i]
    }
}

void print_element(int *p) {
    printf("element is %d\n", *p);
}

int main() {
    int arr[3] = {1, 2, 3};
    process(arr, 3, print_element);
    return 0;
}
这里的 process 函数接受一个函数指针 callback 作为参数,并在处理数组中每个元素之前调用它。在 main 函数中,调用 process 函数并将 print_element 函数作为回调函数传递进去,输出结果为:

element is 1
element is 2
element is 3

这里的 print_element 函数用于打印数组中的每个元素。

总之,函数指针是 C语言中非常重要和强大的特性,可以提高代码的灵活性和可重用性。掌握函数指针的使用可以使程序员写出更加高效和健壮的代码。

推荐阅读