当前位置:网站首页>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*) = test
pf 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 .
边栏推荐
- AutoLISP series (3): function function 3
- Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
- asyncio 概念和用法
- [C language] question set of X
- spark调优(三):持久化减少二次查询
- 记一次项目的迁移过程
- Opencv personal notes
- Mysql database basic operation DQL basic query
- 01tire+ chain forward star +dfs+ greedy exercise one
- Communication mode between application program and MATLAB
猜你喜欢
分步式監控平臺zabbix
Unity3d click events added to 3D objects in the scene
平衡二叉树(AVL)
【Android -- 数据存储】使用 SQLite 存储数据
MySQL数据库基本操作-DQL-基本查询
Opencv personal notes
2022 the 4th China (Jinan) International Smart elderly care industry exhibition, Shandong old age Expo
Balanced binary tree (AVL)
Power of leetcode-231-2
Leetcode-231-2的幂
随机推荐
Lecturer solicitation order | Apache seatunnel (cultivating) meetup sharing guests are in hot Recruitment!
Continuous creation depends on it!
PHP中exit,exit(0),exit(1),exit(‘0’),exit(‘1’),die,return的区别
IP地址和物理地址有什么区别
水平垂直居中 方法 和兼容
Prometheus API deletes all data of a specified job
二叉搜索树(特性篇)
[flower carving experience] 15 try to build the Arduino development environment of beetle esp32 C3
prometheus api删除某个指定job的所有数据
Performance measure of classification model
应用程序和matlab的通信方式
Vs tool word highlight with margin
分步式監控平臺zabbix
Logback logging framework third-party jar package is available for free
php 自带过滤和转义函数
Unity3d click events added to 3D objects in the scene
What is the difference between IP address and physical address
Laravel 中config的用法
Find tags in prefab in unity editing mode
The differences between exit, exit (0), exit (1), exit ('0 '), exit ('1'), die and return in PHP