思路大纲:
前言
本节博客继续来探讨关于指针初阶相关问题
1.回调函数
可能许多人对回调函数这个概念比较陌生哈,下面来简单介绍一下什么是回调函数?
回调函数:回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数
时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条
件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
为了便于大家理解,下面来进行简单的举例(以实现简单的±*/计算代码为例):
注:该代码并不完善,仅作举例说明
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void menu(void) { printf("1.+\n"); printf("2.-\n"); printf("3.*\n"); printf("4./\n"); printf("0.exist\n"); printf("default.error\n"); } int Add(int x,int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void Cala(int(*p)(int, int)) { int x = 0; int y = 0; printf("input tow new:>\n"); scanf("%d %d", &x, &y); printf("the answer is :> %d\n\n\n",p(x, y)); } int main() { int input = 0; do { printf("please option:>\n\n"); menu(); scanf("%d",&input); switch (input) { case 0: printf("you are exsting the compare!\n"); break; case 1: Cala(Add); break; case 2: Cala(Sub); break; case 3: Cala(Mul); break; case 4: Cala(Div); break; default: printf("error,reoption\n"); break; } }while(input); return 0; }
这些Add,Sub,Mul,Div函数就属于回调函数了!
2.qsort函数的使用
qsort 是 C 语言标准库中的一个函数,用于对数组进行快速排序。它的头文件是 stdlib.h。
下面是两个qsort函数的简单使用举例:
普通的整型数组:
//qsort函数的使用 #include<stdlib.h> #include<stdio.h> int int_cmp(const void* e1,const void* e2) { return *((int*)e1) - *((int*)e2); } int main() { int arr[] = { 1,4,7,8,5,2,3,6,9,0 }; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), int_cmp); int i = 0; for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { printf("%d ", arr[i]); } return 0; }
结构体数组(按照年龄来排序):
//qsort函数的使用 struct stu { char name[10]; int age; }; #include<stdlib.h> #include<stdio.h> int int_cmp(const void* e1, const void* e2) { return ((struct stu*)e1)->age-((struct stu*)e2)->age; } int main() { struct stu arr[3] = { {"lisi",15},{"zhangsan",18},{"wangwu",20} }; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), int_cmp); int i = 0; for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("name = %s; age = %d\n", arr+i,(arr+i)->age); } return 0; }
3.qsort函数的模拟实现
# include<stdio.h> void my_swave(void*e1,void* e2,size_t size) { int i = 0; for (i = 0; i < size; i++) { char temp = *((char*)e1+i); *((char*)e1+i) = *((char*)e2+i); *((char*)e2+i) = temp; } } int int_cmp(const void* e1, const void* e2) { return (*((int*)e1) - *((int*)e2)); } void my_qsort(void* arr, size_t count, size_t size, int(*int_cmp)(const void* e1, const void* e2)) { int i = 0; int j = 0; for (i = 0; i < count - 1; i++) { for (j = 0; j < count - i - 1; j++) { if (int_cmp((char*)arr + size * j, (char*)arr + size * (j + 1))>0) { my_swave(((char*)arr + size * j), ((char*)arr + size * (j + 1)),size); } } } } int main() { int arr[10] = { 2,3,5,7,1,6,9,0,0,0 }; my_qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),int_cmp); int i = 0; for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { printf("%d ", arr[i]); } return 0; }