目录
一、函数指针
函数指针是定义一个指向函数的指针变量。函数指针是指针,它指向一个函数而不是指向一个变量或数据。
1.函数指针的基本形式:
return_type (*pointer_name)(parameter_types);
return_type
:函数的返回类型。pointer_name
:函数指针的名称。parameter_types
:函数的参数类型。
例如:
void *(*func)(int a,int b) ;
上述一行代码定义了一个函数指针,返回的指针类型是void *类型,其中参数为两个int型的数;
2.函数指针的使用方法
(1)直接使用
#include<stdio.h>
#include<stdlib.h>
/*定义一个指针函数*/
void (* pfun)(int data);
void myfun(int data)
{
printf("get data %d\n",data);
}
int main(int argc,char **argv)
{
/*指针函数pfun指向函数myfun*/
pfun = myfun;
(*pfun)(100);
return 0;
}
具体实现流程:定义一个返回值为void的函数指针——>把函数指针赋值给myfun,也就是myfun的首地址——>pfun获得myfun首地址,pfun地址==myfun地址——>最终调用pfun等于调用myfun
(2)typedef+函数指针
#include<stdio.h>
#include<stdlib.h>
/*typedef的功能是定义一个新的类型。第一句就定义了一种pfun的类型,并定义这种类型为指向某个函数的指针,这个函数以一个int为参数并返回void类型*/
typedef void (*pfun)(int data);
void myfun(int data)
{
printf("get data : %d\n",data);
}
int main(int argc,char **argv)
{
pfun p = myfun;//函数指针指向执行函数的地址
p(100);
return 0;
}
用typedef来定义一个函数指针,这样可以在大型代码中更加简洁。pfun代表的是函数的类型,通过pfun来代表“void (*)(int)”函数类型,即pfun是函数指针的别名,“pfun p”相当于定义了一个“void (*p)(int)”的函数指针。p = myfun可以理解为函数指针p指向函数myfun的首地址;p(100)相当于执行函数myfun(100).
(3)结构体函数指针
#include <stdio.h>
// 定义一个结构体,其中包含一个函数指针成员
struct Calculator {
int (*operation)(int, int);
};// 定义两个函数,用于加法和减法
int add(int a, int b) {
return a + b;
}int subtract(int a, int b) {
return a - b;
}int main() {
// 声明一个结构体变量
struct Calculator calc;// 将函数指针成员指向add函数
calc.operation = add;// 使用结构体中的函数指针调用add函数
int result_add = calc.operation(5, 3);
printf("Result of add: %d\n", result_add);// 将函数指针成员指向subtract函数
calc.operation = subtract;// 使用结构体中的函数指针调用subtract函数
int result_subtract = calc.operation(5, 3);
printf("Result of subtract: %d\n", result_subtract);return 0;
}
在这个例子中,Calculator
结构体包含一个名为 operation
的函数指针成员。该结构体的对象 calc
可以存储不同的函数,并且通过该结构体中的函数指针成员来调用相应的函数。这种用法对于实现一些泛型算法、回调机制等非常有用。通过在结构体中使用函数指针,可以实现更加灵活和可扩展的代码结构。
二、指针函数
指针函数是指一个返回指针的函数。在 C 语言中,函数可以返回各种类型的值,包括指针。
1.指针函数的基本形式:
data_type *function_name(parameters);
data_type
:返回指针指向的数据类型。function_name
:函数的名称。parameters
:函数的参数列表。
例如:
int *pfun(int data)
2.指针函数的使用方法
#include <stdio.h>
// 定义一个返回整数指针的函数
int* create_array(int size) {
int* arr = (int*)malloc(size * sizeof(int));
return arr;
}int main() {
int* my_array;// 调用指针函数,创建一个包含5个整数的数组
my_array = create_array(5);// 初始化数组元素
for (int i = 0; i < 5; ++i) {
my_array[i] = i * 2;
}// 打印数组元素
for (int i = 0; i < 5; ++i) {
printf("%d ", my_array[i]);
}// 释放动态分配的内存
free(my_array);return 0;
}
在这个例子中,create_array
是一个指针函数,它返回一个指向整数的指针。在 main
函数中,我们调用了 create_array(5)
,并使用返回的指针动态分配了一个包含5个整数的数组。最后,记得释放动态分配的内存,以避免内存泄漏。指针函数可以用于返回动态分配的内存、返回数组的首地址、返回结构体的指针等。这种用法使得函数能够动态生成并返回数据结构,增加了灵活性和可重用性。
三、函数指针和指针函数的区别
1.函数指针是指向函数的指针,可以用于动态选择调用不同的函数。
2.指针函数是一个返回指针的函数,通常用于返回动态分配的内存或其他指针类型的数据。
3.两者概念不同,分别强调了指针和函数在语法上的不同角色。