1.函数指针的简单用法
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int dec(int a, int b)
{
return a - b;
}
int mult(int a, int b)
{
return a * b;
}
int main()
{
int (*p)(int a, int b) = NULL;
p = mult;
int n = (*p)(66, 77);
p=&add;
p = add;//也可以不取地址符
int m = (*p)(22, 33);
//也可以简易调用,不用加*,编译器会自己处理
int m = p(33, 44);
}
2.函数指针变量的数组
int (*p[8])(int a, int b) = { NULL };
3.用typedef来简化以上语法
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int dec(int a, int b)
{
return a - b;
}
int mult(int a, int b)
{
return a * b;
}
//此时FUNC_PTR不是一个变量,而是一个类型
typedef int(*FUNC_PTR)(int, int);
int main()
{
FUNC_PTR p1, p2, p3;
FUNC_PTR a[8] = { NULL };
return 0;
}
4.回调函数
小案例
//出自B站<<4个小时掌握C指针>>
#include <iostream>
using namespace std;
void A()
{
cout << "hello" << endl;
}
void B(void(*ptr)())//函数指针做参数
{
ptr();
}
int main()
{
//声明一个函数指针
void (*p)() = A;//等价于void (*p)()=NULL;p=A;
B(p);
//以上两条语句也可以简化成B(A); 因为函数的名字返回的就是指针
}
实用场景:实现多种排序规则的排序算法
//出自B站<<4个小时掌握C指针>>
#include<iostream>
using namespace std;
void swap(int* num1, int* num2)//交换两个变量的值
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
void BubbleSort1(int arr[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])//如果想实现降序,只需修改这行代码,把大于号变成小于号
{
swap(&arr[j], &arr[j + 1]);
}
}
}
}
//思考,有时想实现降序排列,有时想实现升序排列,如何实现
//第一个方法,写两个排序函数,但是这样会有很多冗余的重复代码
//第二个方法,多传一个参数给排序函数,告诉它选择升序还是降序
int compare1(int a, int b)//回调函数,把升序规则单独剥离出来
{
if (a > b)
return 1;
else
return -1;
}
int compare2(int a, int b)//回调函数,把降序规则单独剥离出来
{
if (a < b)
return 1;
else
return -1;
}
void BubbleSort2(int arr[], int len, int(*compare)(int, int))//多传一个函数指针作为参数
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (compare(arr[j], arr[j + 1] )> 0)
{
swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main(void)
{
int arr[9] = { 7,5,2,4,9,8,6,7,1 };
int len = sizeof(arr) / sizeof(arr[0]);
BubbleSort1(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
BubbleSort2(arr, len,compare1);//升序
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
BubbleSort2(arr, len, compare2);//降序
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
自己编写的BubbleSort只能实现一种数据类型的数组的排序
想要接收任意的数组,需要调用库函数qsort(),该库函数包含在stdlib.h中,qsort()需要传入的四个参数自行查阅csdn
//出自B站<<4个小时掌握C指针>>
#include<stdio.h>
#include<stdlib.h>
//利用库函数实现排序功能,需要指定排序规则
int compare_int(const void* a, const void* b)
{
int* a1 = (int*)a;
int* b1 = (int*)b;
return *a1 - *b1;//此时是执行升序规则,如果是return *b1-*a1;则是降序功能
}
int main()
{
int arr[] = { 2,4,2,4,6,8,3 };
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr,n,sizeof(int), &compare_int);//可省略取地址符,可以接收任意数据类型的数组
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}