08函数指针的定义
- QT中打印地址不会改变,或者改变很小
- 函数指针指向函数的地址 如何定义函数指针
- 返回值 函数名 (参数列表) void
(*pFuncPointer)(int) = (void(*)(int))4199952;
- 先定义函数类型,再通过类型定义出函数指针
typedef void(FUNC_TYPE)();
FUNC_TYPE *pFunc = Func;
- 先定义出函数指针类型,再定义函数指针
typedef void(*FUNC_TYPE)();
FUNC_TYPE pFunc = Func;
- 直接定义函数指针变量
void(*pFunc)() = Func;
pFunc();
- 函数指针的数组定义
void (*pFunc[3])();
函数指针和指针函数的区别???
函数指针 是指向函数的 指针
指针函数 函数的返回值是一个指针的 函数
int * func();
代码:
#include <stdio.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("1\n");
}
void Func2()
{
printf("2\n");
}
void Func3()
{
printf("3\n");
}
void test04()
{
int i;
void (*pFunc[3])();
pFunc[0] = Func1;
pFunc[1] = Func2;
pFunc[2] = Func3;
for(i=0; i<3; i++)
{
pFunc[i]();
}
}
int main()
{
//test01();
//test02();
// test03();
test04();
return 0;
}
09函数指针做函数参数—回调函数
提供一个函数,可以将任意的数据类型 打印出来
代码:
#include <stdio.h>
void printText(void *data, void (*myPrint)(void *))
{
myPrint(data);
}
void myPrintInt(void *data)
{
int *num = data;
printf("data=%d\n", *num);
}
void test01()
{
int a = 100;
printText(&a, myPrintInt);
}
struct Person
{
char name[64];
int age;
};
void myPrintStruct(void *data)
{
struct Person *p = data;
printf("name=%s, age=%d\n", p->name, p->age);
}
void test02()
{
struct Person p = {"aaa", 21};
printText(&p, myPrintStruct);
}
int main()
{
// test01();
test02();
return 0;
}
10回调函数案例
- 提供一个函数,可以打印任意类型的数组
- 提供一个查找数组中元素的函数
#include <stdio.h>
#include <string.h>
struct Person {
char name[64];
int age;
};
void printAllArray(void *arr, int eleSize, int len, void (*myFunc)(void *)) {
int i;
char *p = arr;
for (i = 0; i < len; i++) {
char *eleAddr = p + i * eleSize;
myFunc(eleAddr);
}
}
void myPrintInt(void *data) {
int *num = data;
printf("%d\n", *num);
}
void test01() {
int arr[6] = {1, 2, 3, 4, 5, 6};
int len = sizeof(arr) / sizeof(int);
printAllArray(arr, sizeof(int), len, myPrintInt);
}
void myPrintPerson(void *data) {
struct Person *p = data;
printf("name=%s, age=%d\n", p->name, p->age);
}
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);
}
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;
}
//参数1 数组首地址 参数2 每个元素占的内存空间 参数3 元素个数 参数4 查找元素的地址 参数5 回调函数
int myFindPerson(void *arr, int eleSize, int len, void *data,
int (*myCompare)(void *, void *)) {
char *p = arr;
int i;
for (i = 0; i < len; i++) {
char *eleAddr = p + i * eleSize;//获取每个元素的首地址
//if(eleAddr 和 data 的元素 相等)
if (myCompare(eleAddr, data)) {
return 1;
}
}
return 0;
}
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("yes\n");
} else {
printf("no\n");
}
}
int main() {
// test01();
// test02();
test03();
return 0;
}