c语言进阶部分详解(指针进阶2)
大家好!我快马加鞭接着写出指针部分part2部分。第一部分见:c语言进阶部分详解(指针进阶1)_总之就是非常唔姆的博客-CSDN博客
指针初阶部分见:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客
一.函数指针
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;
}
今天的内容先到这里了,下一次不出意外是针对回调函数进行更加详细事例演示及模拟。
感谢大家的支持!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)