当前位置:网站首页>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 .

原网站

版权声明
本文为[chencli]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071417430478.html