【C语言进阶】- 指针进阶(2)

目录

函数指针

函数指针数组

指向函数指针数组的指针

回调函数


函数指针

一个函数也是有地址的,把它的地址取出来就是函数指针

如:

#include <stdio.h>

void test()
{
	printf("hehe\n");
}
int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);
	return 0;
}

打印出来的结果是:

  

所以,函数名就是它的地址,&函数名也是它的地址 ( 和数组有所差别 ) 

那我们的函数的地址要想保存起来,怎么保存呢?

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int (*pf)(int, int) = Add;//pf就是一个函数指针变量
	int ret = (*pf)(2, 3);
	printf("%d", ret);
	return 0;
}

 函数指针是有参数类型,有返回值类型的

函数指针数组

用数组存储函数指针,就是一个数组类型是函数指针类型

#include <stdio.h>

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()
{
	//字符指针数组
	char* arr1[5];
	
	//整型指针数组
	int* arr2[5];

	//数组指针数组
	int* ((*p)[5])[5];


	int (*pf1)(int, int) = Add;
	int (*pf2)(int, int) = Sub;
	int (*pf3)(int, int) = Mul;
	int (*pf4)(int, int) = Div;
	//函数指针数组
	int (*pf[4])(int, int) = { Add,Sub,Mul,Div };

	//函数指针数组的使用
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int ret = pf[i](5, 4);
		printf("%d\n", ret);
	}
	return 0;
}

 运行结果:

指向函数指针数组的指针

指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针
 

#include <stdio.h>

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 (*pf) (int, int) = Add;

	//函数指针数组
	int (*pfArr[4]) (int, int) = { Add,Sub,Mul,Div };

	//指向 函数指针数组的 指针
	int (*(*p)[4]) (int, int) = &pfArr;

	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int ret = (*p)[i](2, 3);
		printf("%d\n", ret);
	}
	return 0;
}

 

调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

简单说就是A函数的地址传给B函数,在B函数中利用A的指针调用A函数,那么A函数就叫做回调函数

#include <stdio.h>

void test()
{
	printf("hehe\n");
}

void print_hehe(void (*p)())
{
	p();
}

int main()
{
	print_hehe(test);
    return 0;
}

这里的test函数就是回调函数 

 qsort库函数(基于快速排序算法实现的一个排序函数)可以排任意的数据

#include <stdio.h>
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}

int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

这里的qsort库函数内部就调用了int_cmp函数,int_cmp函数就是回调函数

按照qsort函数的形式,实现冒泡函数

猜你喜欢

转载自blog.csdn.net/qq_54880517/article/details/124211563