基础知识参照C语言指针
一、函数指针
- 如果一个函数的函数是
void test(){}
,打印函数地址printf(“%p”,test)
、printf(“%p”,&test)
。
用什么变量来接收这个函数地址?
void (*p)()
(*(void (*)())0)() //调用0地址处函数,先把0地址强制转化为函数指针(void (*)()),再解引用调用这个函数
void (*signal(int,void (*) (int)))(int) \\首先这是一个函数声明,函数的返回类型是void (*)(int),函数名是signal,有两个参数,一个是int,另外一个是void (*)(int)
简化这个代码可以写成
typedef void(*fun)(int);
fun signal(int,fun);
- 函数指针数组:
int (*pp[10])()
,其主要作用可以用来做转移表,即存储函数指针的数组。
二、回调函数
可以把自定义函数的参数设置成函数指针,就可以实现函数的嵌套调用。
自定义冒泡排序函数:
#include <stdio.h>
#include <stdlib.h>
void Swap(char *p1,char *p2,int size)
{
char temp = 0;
for (int i = 0; i < size; i++)
{
temp = *(p1 + i);
*(p1 + i) = *(p2 + i);
*(p2 + i) = temp;
}
}
int cmp_int(const void *p1, const void *p2)
{
int* pp1 = (int*)p1;
int* pp2 = (int*)p2;
return *pp1-*pp2;
}
void bubble_sort(void *p, int sz, int num, int (*cmp)(const void *, const void*))
{
char *arr = (char *)p;
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp(arr + j * num, arr + j * num + num) > 0)
Swap(arr + j * num, arr + j * num + num, num);
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int num = sizeof(arr[0]);
bubble_sort(arr, sz, num, cmp_int);
return 0;
}