1. 关于回调函数描述错误的是( )
A.回调函数就是一个通过函数指针调用的函数
B.回调函数一般通过函数指针实现
C.回调函数一般不是函数的实现方调用,而是在特定的场景下,由另外一方调用。
D.回调函数是调用函数指针指向函数的函数。
答案解析:
“调用指针”、“指向函数”是什么鬼……D选项简直逻辑鬼才!ABC就是基础概
2. qsort模拟实现
模仿qsort的功能实现一个通用的冒泡排序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void swap(char* e1, char* e2)
{
int tmp = *(int*)e1;
*(int*)e1 = *(int*)e2;
*(int*)e2 = tmp;
}
int compare_int(const void* e1,const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
void bubble_qsort(void* base, int sz, int width, int (*compare)( const void* e1, const void* e2))
{
for (int i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - i - i; j++)
{
if (compare((char*)base + (width * j), (char*)base + width * (j + 1))>0)
{
swap((char*)base + (width * j), (char*)base + (width * (j + 1)));
}
}
}
}
void printarr(int arr[],int sz)
{
for (int i = 0; i < sz; i ++ ) {
printf("%d ", arr[i]);
}
}
void testint(int arr[],int sz,int width)
{
bubble_qsort(arr, sz, width, compare_int);
printarr(arr,sz);
}
int main()
{
int arr[] = { 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int width = sizeof(arr[0]);
printarr(arr,sz);
testint(arr,sz,width);
return 0;
}
3. qsort使用练习
练习使用库函数,qsort排序各种类型的数据
#include<stdio.h>
#include <stdlib.h>
void printarr(int arr[],int sz)
{
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
}
int compair(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void TestInt() {
int arr[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
int sz = sizeof(arr) / sizeof(arr[0]);
printarr(arr,sz);
qsort(arr, sz, sizeof(arr[0]), compair);
printarr(arr, sz);
}
struct Stu
{
char name[20];
int age;
double score;
}Stu;
int compairStu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void testStu()
{
struct Stu arr[3]= { {"田轩宇",19,100},{"田轩宇一号",20,100},{"田轩宇二号",20,100} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), compairStu_by_age);
}
int main()
{
//TestInt();
testStu();
return 0;
}