一.函数指针
1.讲解与实例
函数指针: 在C语言中,函数指针是指向函数的指针变量。它可以像其他变量一样存储在内存中,并且可以通过函数指针来调用相应的函数。
声明函数指针:returnType (*pointerName)(parameterTypes);
其中:
returnType
是函数的返回类型。pointerName
是函数指针的名称。parameterTypes
是函数的参数类型
// 定义一个函数 int add(int a, int b) { return a + b; } int main() { // 声明一个函数指针 int (*funcPtr)(int, int); // 将函数指针指向add函数 funcPtr = add; // 通过函数指针调用函数 int result = funcPtr(2, 3); // 结果为5 平时调用函数时都是函数名(地址),也可以想通 int result = (*funcPtr)(2, 3); // 这两种均可以,funcPtr是地址,通过*解引用来找到 return 0; }
2.《C陷阱和缺陷》中两段经典代码
2.1 ( * ( void ( * )( ) ) 0 ) ( );
//代码1 ( * ( void ( * )( ) ) 0 ) ( );
- void ( * )( )这是一个函数指针的类型声明。它表示一个没有参数并且返回类型为
void
的函数指针 - ( void ( * )( ) )0 这是对0进行强制类型转化,转换为函数指针类型
- * ( void ( * )( ) ) 0 对地址为0的函数地址解引用
- ( * ( void ( * )( ) ) 0 ) ( ) 调用这个函数
2.2void ( * signal( int , void( * ) ( int ) ) ) (int);
//代码2 void ( * signal( int , void( * ) ( int ) ) ) (int);
void (*signal(int, void (*)(int)))(int):这是一个函数声明的语法。它表示signal是一个函数,接受两个参数:一个int类型的参数和一个指向接受int类型参数并返回void的函数指针的参数。该函数返回一个指向接受int类型参数并返回void的函数指针的结果
二.函数指针数组
1.讲解与实例
函数指针数组: 函数指针数组是一个数组,其中的每个元素都是一个函数指针。可以将不同的函数指针存储在数组中,并根据需要使用它们
声明函数指针数组:return_type (*array_name[size])(parameter_list);
return_type
:函数指针指向的函数的返回类型。(*array_name)
:函数指针数组的名称。它是一个指针,指向一个数组。[size]
:函数指针数组的大小。它表示数组中函数指针的数量。(parameter_list)
:函数指针指向的函数的参数列表
相比于函数指针只是多了一个[ ]在函数名后面而已
// 定义函数1 void func1(int num) { printf("This is function 1. Number: %d\n", num); } // 定义函数2 void func2(int num) { printf("This is function 2. Number: %d\n", num); } // 定义函数3 void func3(int num) { printf("This is function 3. Number: %d\n", num); } int main() { // 将函数指针赋值给函数指针数组的元素 void(*pf[3])(int) = { &func1,&func2, &func3 }; // 调用函数指针数组中的函数 for (int i = 0; i < 3; i++) { pf[i](i); } return 0; }
2.使用来实现计算器
void menu() { printf("******************************\n"); printf("*** 1.add 2.sub ***\n"); printf("*** 3.mul 4.div ***\n"); printf("*** 0.exit ***********\n"); printf("******************************\n"); } int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } int main() { int input = 1; int result = 0; int a = 0; int b = 0; while (input) { menu(); printf("请输入:\n"); scanf("%d", &input);//根据menu来输入数字啦 int(*pf[5])(int, int) = { NULL,add,sub,mul,div };//第一个是NUll是为了使数字与菜单对应 if (input >= 1 && input <= 4) { printf("请输入两个数\n"); scanf("%d %d", &a, &b); result = pf[input](a, b); printf("%d\n", result); } else if(input==0) { printf("退出计算器"); } else { printf("输入有误,请重新输入"); } } return 0; }
三.指向函数指针数组的指针
指向函数指针数组的指针是一个 指针,指针指向一个数组 ,数组的元素都是函数指针
指向函数指针数组的指针的语法如下:
return_type (*(*pointer_name)[size])(parameter_list);
return_type
:函数指针指向的函数的返回类型。(*pointer_name)
:指向函数指针数组的指针的名称。它是一个指针,指向一个函数指针数组。[size]
:函数指针数组的大小。它表示数组中函数指针的数量。(parameter_list)
:函数指针指向的函数的参数列表
相比与函数指针数组只是在名字前多一个*来说明是指针而已
四.回调函数
1.讲解
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
2.事例
int add(int x, int y) { return x + y; } // 定义一个回调函数 void callback(int result) { printf("回调函数被调用,结果为:%d\n", result); } // 定义一个函数,接受一个函数指针作为参数 void performOperation(int (*operation)(int, int), int a, int b, void (*callback)(int)) { int result = operation(a, b); callback(result); } int main() { // 调用函数,并传递回调函数作为参数 performOperation(add, 2, 3, callback); return 0; }
今天的内容先到这里了,下一次不出意外是针对回调函数进行更加详细事例演示及模拟。
感谢大家的支持!!