大家好!我快马加鞭接着写出指针部分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_namesize)(parameter_list);
return_type
:函数指针指向的函数的返回类型。(*array_name)
:函数指针数组的名称。它是一个指针,指向一个数组。[size]
:函数指针数组的大小。它表示数组中函数指针的数量。(parameter_list)
:函数指针指向的函数的参数列表
相比于函数指针只是多了一个 在函数名后面而已
代码语言:javascript复制// 定义函数1
void func1(int num) {
printf("This is function 1. Number: %dn", num);
}
// 定义函数2
void func2(int num) {
printf("This is function 2. Number: %dn", num);
}
// 定义函数3
void func3(int num) {
printf("This is function 3. Number: %dn", num);
}
int main() {
// 将函数指针赋值给函数指针数组的元素
void(*pf[3])(int) = { &func1,&func2, &func3 };
// 调用函数指针数组中的函数
for (int i = 0; i < 3; i ) {
pf[i](i);
}
return 0;
}
2.使用来实现计算器
代码语言:javascript复制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("%dn", 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.事例
代码语言:javascript复制int add(int x, int y)
{
return x y;
}
// 定义一个回调函数
void callback(int result)
{
printf("回调函数被调用,结果为:%dn", 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;
}
今天的内容先到这里了,下一次不出意外是针对回调函数进行更加详细事例演示及模拟。
感谢大家的支持!!