当前位置:网站首页>Advanced C language -- function pointer
Advanced C language -- function pointer
2022-07-07 16:35:00 【chencli】
Let's look at a code first :
#include<stdio.h>
void test()
{
printf("haha\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
The output is two addresses , The name of the function is the address of the function
Save the address of the function :
#include<stdio.h>
void test()
{
printf("haha\n");
}
int main()
{
// A function pointer
int (*pf)(const char*) = test;
(*pf)("abc");
pf("abc");
test("abc");
return 0;
}Function pointers are also pointers , Is a pointer to a function
int (*pf)(const char*) = testpf The first and * combination , Is a pointer , Point to test function , No parameter , The return value type is void
《C Pitfalls and pitfalls 》 A piece of code :
( *(void (*)())0 )();void(*)() It's a function pointer type
( void (*)() )0 Is a cast , The result is the address of the function ,0 Store a function in the address , No parameter , No return value
The above code is generally a function call , It's called 0 As a function at the address , First turn on the 0 Cast to no parameter , The return type is void The address of the function , The second is to call 0 This function at the address
Look at this code again :
void (*signal(int , void(*)(int)))(int);Code can be simplified :
hold void(*)(int) Rename it to pfun_t
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);signal Combine with the following parentheses , Is the function name
( int , void(*)(int) ) Are two parameter types
The above code is a function declaration ,signal The type of the first argument to the function is int, The second parameter type is the function pointer , The pointer points to a parameter of type int, Function with null return value ,signal The return type of a function is also a pointer function , The function pointer also points to a parameter of type int, Function with null return value
Use function pointers to simplify code :
When there are more identical codes in functions with similar functions , Function pointers can be used to simplify code
void calc( int(*pf) (int, int) )
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
printf("*****************\n");
printf("***1.sum 2.sub***\n");
printf("***3.mul 4.div***\n");
printf("*****0. sign out *****\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;
}
// Calculation
void calc(int(*pf)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf(" Enter two operands :");
scanf("%d%d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
printf(" Please select ");
scanf("%d", &input);
switch(input)
{
case 1:
calc(add);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
case 0:
printf(" Exit calculator !\n");
break;
default:
printf(" Wrong choice !\n");
break;
}
} while (input);
return 0;
}The above code uses the callback function , Callback function It's a pass through A function pointer Called function . If you put Pointer to function ( Address ) Pass as argument to another function , When this pointer is used to call the function it points to , Let's just say this is a callback function . The callback function is not called directly by the function's implementer , It's called by another party when a particular event or condition occurs , Used to respond to the event or condition .
边栏推荐
- Detailed explanation of several ideas for implementing timed tasks in PHP
- What about the pointer in neural network C language
- 模拟Servlet的本质
- JS modularization
- php 自带过滤和转义函数
- Record the migration process of a project
- 【知识小结】PHP使用svn笔记总结
- 【PHP】PHP接口继承及接口多继承原理与实现方法
- Tidb cannot start after modifying the configuration file
- Three. JS series (1): API structure diagram-1
猜你喜欢

MySQL数据库基本操作-DQL-基本查询
![[flower carving experience] 15 try to build the Arduino development environment of beetle esp32 C3](/img/8f/ca9ab042916f68de7994d9f2124da9.jpg)
[flower carving experience] 15 try to build the Arduino development environment of beetle esp32 C3

HAVE FUN | “飞船计划”活动最新进展

The difference and working principle between compiler and interpreter

谈谈 SAP iRPA Studio 创建的本地项目的云端部署问题

1亿单身男女“在线相亲”,撑起130亿IPO

Performance comparison of tidb for PostgreSQL and yugabytedb on sysbench

Statistical learning method -- perceptron

Personal notes of graphics (3)

Mysql database basic operation DQL basic query
随机推荐
Laravel5.1 Routing - routing packets
Leetcode-136- number that appears only once (solve with XOR)
js中复选框checkbox如何判定为被选中
修改配置文件后tidb无法启动
Spark Tuning (III): persistence reduces secondary queries
[vulnhub range] thales:1
The inevitable trend of the intelligent development of ankerui power grid is that microcomputer protection devices are used in power systems
Imitate the choice of enterprise wechat conference room
应用程序和matlab的通信方式
Tidb cannot start after modifying the configuration file
asyncio 概念和用法
JS 模块化
The difference and working principle between compiler and interpreter
pycharm 终端部启用虚拟环境
【DesignMode】模板方法模式(Template method pattern)
MySQL数据库基本操作-DQL-基本查询
Three. JS series (3): porting shaders in shadertoy
Personal notes of graphics (4)
Performance measure of classification model
Tragedy caused by deleting the console statement