首页 > 编程笔记 > C语言笔记

函数指针和指针函数的区别(附带示例)

在C语言中,函数指针和指针函数是两个容易混淆的概念。虽然它们的名字听起来很相似,但实际上它们有着本质的区别。

函数指针

函数指针是一种特殊类型的指针,它指向一个函数而不是一份数据。换句话说,函数指针存储的是函数在内存中的地址。通过函数指针,我们可以在程序运行时动态地选择要调用的函数,这为程序提供了极大的灵活性。函数指针常用于实现回调机制、构建函数表等高级编程技巧。
 

函数作为一个代码块,编译以后也要放在内存中(具体来说是内存中的代码段);既然放在内存中,那它就有地址,就能被指针指向。

 

函数指针的声明语法如下:

返回值类型 (*指针名称)(参数列表);

举个例子,假设我们要声明一个指向接受两个 int 参数并返回 int 的函数的指针,可以这样写:

int (*func_ptr)(int, int);

在这个声明中,func_ptr 是一个指针,它可以指向任何接受两个 int 参数并返回 int 的函数。我们可以将某个符合这个签名的函数的地址赋值给 func_ptr,然后通过 func_ptr 来调用该函数。


现在,让我们看一个使用函数指针的具体例子:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    int (*operation)(int, int);
    int result;

    operation = add;
    result = operation(5, 3);
    printf("加法结果:%d\n", result);

    operation = subtract;
    result = operation(5, 3);
    printf("减法结果:%d\n", result);

    return 0;
}

输出结果:

加法结果:8
减法结果:2

在这个例子中,我们定义了一个函数指针 operation,它可以指向 add 或 subtract 函数。通过改变 operation 的指向,我们可以动态地选择要执行的操作。

指针函数

指针函数是指返回指针的函数。这种函数的返回值是一个指针,可以是指向任何数据类型的指针,包括基本数据类型、结构体、甚至是另一个函数的指针。指针函数在需要动态分配内存或者返回复杂数据结构时特别有用。
 

指针函数的声明语法如下:

返回值类型* 函数名称(参数列表);

例如,一个返回 int 指针的函数可以这样声明:

int* get_array(int size);

这个函数 get_array 接受一个 int 参数 size,并返回一个指向 int 的指针,这种函数可能用于动态分配一个整数数组并返回其首地址。

 

让我们看一个使用指针函数的实际例子:

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

int* create_array(int size) {
    int* arr = (int*)malloc(size * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }
    for (int i = 0; i < size; i++) {
        arr[i] = i * 10;
    }
    return arr;
}

int main() {
    int size = 5;
    int* dynamic_array = create_array(size);

    printf("动态创建的数组内容:\n");
    for (int i = 0; i < size; i++) {
        printf("%d ", dynamic_array[i]);
    }
    printf("\n");

    free(dynamic_array);
    return 0;
}

输出结果:

动态创建的数组内容:
0 10 20 30 40

在这个例子中,create_array 是一个指针函数,它动态分配一个整数数组并返回指向该数组的指针。主函数调用这个指针函数来创建一个动态数组,然后打印数组内容,最后释放分配的内存。

函数指针和指针函数的区别

总的来说,函数指针和指针函数的主要区别是:


函数指针允许我们在运行时选择要调用的函数,而指针函数则允许我们返回动态分配的内存或复杂的数据结构。

相关文章