您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

函数指针学习

函数指针

  • 定义的三种方式
  • 函数指针数组
  • 提供一个打印函数,可以打印任意类型的数据
  • 提供一个函数,实现可以打印任意类型的数组
  • 数组查找

定义的三种方式

符号说明
void函数返回值类型
(*FUNC_TYPE2)函数指针名
(int, char)参数列表
	void func(int a , char c)
	{
	printf("hello world\n");
	}

	//1、先定义出函数类型,再通过类型定义函数指针
	typedef void(FUNC_TYPE)(int, char);
	FUNC_TYPE* pFunc = func;
	//pFunc(10,'a');

	//2、定义出函数指针类型,通过类型定义函数指针变量
	typedef void(*FUNC_TYPE2)(int ,char);
	FUNC_TYPE2 pFunc2 = func;
	//pFunc2(10, 's');

	//3、直接定义函数指针变量
	//int* pFun3 = func;
	void(*pFunc3)(int, char) = func;
	pFunc3(10,'d');

函数指针数组

符号说明
*pArray[3]指针数组
pArray[i] ()函数调用
void func1()
{
	printf("func1 调用了\n");
}

void func2()
{
	printf("func2 调用了\n");
}

void func3()
{
	printf("func3 调用了\n");
}

//函数指针数组
void test02()
{
	void(*pArray[3])();

	pArray[0] = func1;
	pArray[1] = func2;
	pArray[2] = func3;

	for (int i = 0; i < 3; i++)
	{
		pArray[i]();
	}
}

提供一个打印函数,可以打印任意类型的数据

void printText(void * data,void(*myPrintInt)(void *))
{
	myPrintInt(data);
}
void myPrintInt(void * data)
{
	int* num = data;
	printf("%d\n", *num);
}
void test01()
{
	int a = 10;
	printText(&a,myPrintInt);
}

提供一个函数,实现可以打印任意类型的数组

void printAllArray(void * pArray,int eleSize,int len,void(*myPrint)(void*))
{
	char* p = pArray;
	for (int i = 0; i < len; i++)
	{
		//获取数组中每个元素的首地址
		char* eleAddr = p + eleSize * i;
		//交换给用户做打印操作
		myPrint(eleAddr);
	}
}
void myPrintInt(void * data)
{
	int* num = data;
	printf("%d\n",*num);
}
void test01()
{
	int arr[5] = { 1,2,3,4,5 };
	int len = sizeof(arr) / sizeof(int);
	printAllArray(arr,sizeof(int),len,myPrintInt);
}

数组查找

  • 注意字符串比较
  • 学习用地址取值
struct Person {
	char name[64];
	int age;
};
void myPrintperson(void* data)
{
	struct Person* p = data;
	printf("姓名:%s  年龄:%d \n", p->name, p->age);
}

//查找数组中的元素是否存在
//参数1  数组首地址   参数2  每个元素的大小  参数3  数组元素个数  参数4 查找数据
int findArrayEle(void * pArray,int eleSize,int length, void *data,int(*myCompare)(void*,void*))
{
	char* p = pArray;
	for (int i = 0; i < length; i++)
	{
		//每个元素的首地址
		char* eleAddr = p + eleSize * i;
		//if ( 数组中的变量的元素 == 用户传入的元素)
		if (myCompare(eleAddr,data))
		{
			return 1;
		}

	}
	return 0;
}
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;*/
	return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
void test02()
{
	struct Person psersonArray[] =
	{
		{"aaa",10},
		{"bbb",20},
		{"ccc",30},
		{"ddd",40},
	};

	int length = sizeof(psersonArray) / sizeof(struct Person);
	printAllArray(psersonArray, sizeof(struct Person), length, myPrintperson);

	//查找数组中指定的元素是否存在
	struct Person p = { "ccc",30 };

	int ret = findArrayEle(psersonArray, sizeof(struct Person), length, &p, myComparePerson);
	if (ret)
	{
		printf("找到了元素\n");
	}
	else
	{
		printf("未找到\n");
	}
}

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进