C语言函数指针代码实现功能
程序员文章站
2022-04-03 11:53:19
前言
在众多的高级编程语言中,C语言是最贴近底层的,可以对硬件进行编程可以进行系统级别的开发,这是其他语言无法比拟的,C语言之所以怎么强大主要来源指针,指针是C语言最核心的特性,...
前言
在众多的高级编程语言中,C语言是最贴近底层的,可以对硬件进行编程可以进行系统级别的开发,这是其他语言无法比拟的,C语言之所以怎么强大主要来源指针,指针是C语言最核心的特性,也是很多初学者学习C语言的一道坎,所以许多其他高级编程语言直接将指针干掉进行包装以引用的形式而出现,俗话说C生万物嘛,其他很多高级语言都是从C进化而来的。但是我们学习一定要从难处学,易出用。如果没有对指针进行深度的掌握,那就不要谈掌握C语言了。那么函数指针又是指针中最为强大地方,有了它,我们可以很轻松的进行函数编程,可以将函数作为参数,进行传递,可以很轻松的实现回调函数!回调函数的意义和好处这里就不展开了。下面使用函数指针做一些通用的函数实现。
代码实现功能
今天采用函数指针,来实现对所有一维数组都通用的排序功能、打印功能,用户需要提供针对元素操作的回调函数也就是函数指针。
函数指针介绍
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
代码具体实现
#define _CRT_SECURE_NO_WARNINGS #include #include void fun03_intPrint(void* a) { int* num = (int*)a; printf("%d ", *num); return; } int fun03_intCompare(void* a, void* b) { int* num1 = (int*)a; int* num2 = (int*)b; return *num1-*num2; } void fun03_intSwap(void* a,void* b) { int* num1 = (int*)a; int* num2 = (int*)b; int temp = *num1; *num1 = *num2; *num2 = temp; return; } /* 功能: 实现对所有类型数组的元素进行打印 参数: arr 数组首元素地址 eleSize 数组元素大小,确定元素指针步长 length 数组元素个数 print位打印每个元素的回调函数 */ void fun03_printAllArr(void* arr, int eleSize, int length, void(*print)(void*)) { char* ch = (char*)arr;//强转为char*让其步长为1 for (size_t i = 0; i < length; i++) { print(ch + i*eleSize); } printf("\n"); } /* 功能: 实现对所有类型的一维数组进行排序 参数: arr 数组首元素地址 eleSize 数组元素大小,确定元素指针步长 length 数组元素个数 compare 排序规则回调函数 swap 数据交换回调函数 */ void fun03_chooseSortAllArr(void* arr,int eleSize,int length,int(*compare)(void*,void*),void(*swap)(void*,void*)) { char* ch = (char*)arr; for (size_t i = 0; i < length-1; i++) { int index = i; for (size_t j = i+1; j < length; j++) { int result = compare(ch + i*eleSize, ch + j*eleSize); //前者大 进行交换,升序 if (result > 0) { index = j; } } if (index != i) { swap(ch + i*eleSize, ch + index*eleSize); } } return; } void fun03_test() { int arr[] = { 1,2,4,8,12,11,6 }; printf("排序前:"); fun03_printAllArr(arr, sizeof(int), sizeof(arr) / sizeof(int), fun03_intPrint); fun03_chooseSortAllArr(arr, sizeof(int), sizeof(arr) / sizeof(int), fun03_intCompare, fun03_intSwap); printf("排序后:"); fun03_printAllArr(arr, sizeof(int), sizeof(arr) / sizeof(int), fun03_intPrint); return; } int main(int argc, char *argv[]) { fun03_test(); return 0; }
代码运行结果
下一篇: 揭秘:关羽为何不满黄忠被封五虎上将?