版权声明:本文为小斑马伟原创文章,转载请注明出处!
函数指针:函数指针 是指向函数的指针。
指针函数:指针函数 函数的返回值是一个指针的函数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void func()
{
printf("hello world\n");
}
//函数指针的定义方式
void test01()
{
//先定义出函数类型,再通过类型定义出函数指针
typedef void(FUNC_TYPE)();
FUNC_TYPE* pFunc = func;
pFunc();
}
void test02()
{
//先定义出函数指针类型,再定义函数指针
typedef void(*FUNC_TYPE)();
FUNC_TYPE pFunc = func;
pFunc();
}
void test03()
{
//直接定义函数指针变量
void(*pFunc)() = func;
pFunc();
}
//函数指针的数组
void func1()
{
printf("func1的调用\n");
}
void func2()
{
printf("func1的调用\n");
}
void func3()
{
printf("func1的调用\n");
}
void text04()
{
//函数指针数组的定义
void(*pFunc[3])();
pFunc[0] = func1;
pFunc[1] = func2;
pFunc[2] = func3;
for (int i = 0; i < 3; i++)
{
pFunc[i]();
}
}
int main()
{
test01();
test02();
test03();
text04();
system("pause");
return EXIT_SUCCESS;
}
函数指针做函数参数(回调函数)
提供一个通用的函数,可以打印任意的数据类型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//提供一个函数,可以讲任意的数据类型 打印出来
void printText(void* a, void(*myPrint)(void *))
{
myPrint(a);
}
void myPrintInt(void* data)
{
int* num = data;
printf("%d\n", *num);
}
void myPrintPersion(struct Persion* data)
{
struct Persion *p = data;
printf("姓名: %s 年龄: %d\n", p->name, p->age);
}
void test01()
{
int a = 100;
printText(&a, myPrintInt);
}
void test02()
{
struct Persion p = { "aaa", 23 };
printText(&p, myPrintPersion);
}
struct Persion
{
char name[64];
int age;
};
void main()
{
test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
回调函数案例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Person
{
char name[65];
int age;
};
//1.提供一个函数,可以打印任意类型的数组
void printAllArray(void* arr,int eleSize, int len,void(*myFunc)(void*))
{
char* p = arr;
for (int i = 0; i < len; i++)
{
char* eleAddr = p + i * eleSize; //计算每个元素首地址
//printf("%d\n",*(int*)eleAddr);
myFunc(eleAddr);
}
}
//参数1 数组首地址 参数2 每个元素占得内存空间 参数3 元素个数 参数
4 查找的元素的地址 参数5 回调函数
int myFindPerson(void* arr, int eleSize, int len, void* data, int(*myCompare)(void*,void*))
{
char* p = arr;
for (int i = 0; i < len; i++)
{
char* eleAddr = p + i * eleSize;//获取每个元素的首地址
//if(eleAddr 和 data 的元素 相等)
if (myCompare(eleAddr, data))
{
return 1;
}
}
return 0;
}
void myPrintInt(void* data)
{
int* num = data;
printf("%d\n", *num);
}
void myPrintPerson(void* data)
{
struct Persion* p = data;
printf("姓名: %s 年龄: %d\n", p->name, p->age);
}
int myComparePerson(void* data1, void* data2)
{
struct Person* p1 = data1;
struct Person* p2 = data2;
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age)
{
return 1;
}
return 0;
}
void test01()
{
int arr[5] = { 12, 3, 4, 5, 6 };
int len = sizeof(arr) / sizeof(int);
printAllArray(arr, sizeof(int),len,myPrintInt);
}
void test02()
{
struct Person pArray[] =
{
{ "aaa", 10 },
{ "bbb", 20 },
{ "ccc", 30 },
{ "ddd", 40 },
};
int len = sizeof(pArray) / sizeof(struct Person);
printAllArray(pArray, sizeof(struct Person), len, myPrintPerson);
}
void test03()
{
struct Person pArray[] =
{
{ "aaa", 10 },
{ "bbb", 20 },
{ "ccc", 30 },
{ "ddd", 40 },
};
struct Person p = { "ccc", 30 };
int len = sizeof(pArray) / sizeof(struct Person);
//查找数组中的元素,如果查找到返回1 找不到返回0
int ret = myFindPerson(pArray, sizeof(struct Person), len, &p, myComparePerson);
if (ret)
{
printf("找到了元素\n");
}
else {
printf("未找到了元素\n");
}
}
int main() {
test01();
test02();
test03();
system("pause");
return EXIT_SUCCESS;
}
网友评论