函数指针和指针函数的区别(附带示例)
在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 是一个指针函数,它动态分配一个整数数组并返回指向该数组的指针。主函数调用这个指针函数来创建一个动态数组,然后打印数组内容,最后释放分配的内存。
函数指针和指针函数的区别
总的来说,函数指针和指针函数的主要区别是:
- 函数指针是一个指针变量,用于存储函数的地址。函数指针的本质是变量。
- 指针函数是一个函数,它的返回值是一个指针。指针函数的本质是函数。
函数指针允许我们在运行时选择要调用的函数,而指针函数则允许我们返回动态分配的内存或复杂的数据结构。
ICP备案:
公安联网备案: