当前位置:网站首页>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 .
边栏推荐
- iptables只允许指定ip地址访问指定端口
- laravel中将session由文件保存改为数据库保存
- 【DesignMode】外观模式 (facade patterns)
- 记一次项目的迁移过程
- 121. The best time to buy and sell stocks
- asyncio 概念和用法
- Prediction - Grey Prediction
- 华东师大团队提出,具有DNA调控电路的卷积神经网络的系统分子实现
- [Android -- data storage] use SQLite to store data
- The team of East China Normal University proposed the systematic molecular implementation of convolutional neural network with DNA regulation circuit
猜你喜欢

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

Multiplication in pytorch: mul (), multiply (), matmul (), mm (), MV (), dot ()

【DesignMode】代理模式(proxy pattern)

Have fun | latest progress of "spacecraft program" activities

Cesium(3):ThirdParty/zip. js

"The" "PIP" "entry cannot be recognized as the name of a cmdlet, function, script file, or runnable program."

【DesignMode】外观模式 (facade patterns)
3000 words speak through HTTP cache

二叉搜索树(特性篇)
随机推荐
AutoLISP series (3): function function 3
laravel 是怎么做到运行 composer dump-autoload 不清空 classmap 映射关系的呢?
js中复选框checkbox如何判定为被选中
Usage of config in laravel
分步式監控平臺zabbix
laravel post提交数据时显示异常
AutoLISP series (1): function function 1
What else can an ordinary person do besides working in a factory to make money?
Power of leetcode-231-2
23. 合并K个升序链表-c语言
Cesium (4): the reason why gltf model is very dark after loading
[summary of knowledge] summary of notes on using SVN in PHP
Leetcode-231-2的幂
Laravel 中config的用法
Find tags in prefab in unity editing mode
Personal notes of graphics (2)
TiDB For PostgreSQL和YugabyteDB在Sysbench上的性能对比
【Android -- 数据存储】使用 SQLite 存储数据
How can laravel get the public path
Performance comparison of tidb for PostgreSQL and yugabytedb on sysbench