1. 回调函数是什么?
回调函数就是⼀个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。
void qsort(void base,//指针,指向第一个待排序数组的第一个元素size_t num,//是base指向排序数组的元素个数,size_t size,//base指向的待排序数组元素的大小int (*copare)(cosnt void *cosnt void *,) ;//函数指针---指向的就是两个元素的比较函数
实现这个函数如下面代码:
#include <stdio.h>
#include <tdilib.h>
void parr(int arr[], int sz)
{for (int i = 0;i < sz;i++){primntf("%d ",arr[i]);}
}
int cmpm_it(const void *p1,const void *p2)
{return *(int*)p1-*(int*)p2;
}
int main()
{int arr[] = {9,5,2,4,6,4,8,1};int sz=sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizof(arr[0],cmpm_it);parr(arr,sz);return 0;
}
2.qsort排序结构体/整型数据:
#include <stdio.h>
#include <stdlib.h>
struct stu
{char name[20];int age;
};
void parr(int arr[], int sz)
{for (int i = 0;i < sz;i++){primntf("%d ", arr[i]);}
}
//结构体大小用名字大小比较
int cmpm_it_name(const void* p1, const void* p2)
{return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
}
//结构体大小用年龄大小比较
int cmpm_it_name(const void* p1, const void* p2)
{return (((struct stu*)p1)->age, ((struct stu*)p2)->age);
}
int main()
{struct stu arr[] = {"zhansn",15,"李四",16};int sz = sizoef(arr) / sizeof(arr[0]);qsort(arr, sz, sizof(arr[0]), cmpm_it_name);parr(arr, sz);return 0;
}
3.模拟qsort实现:
#include<stdio.h>
int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}
void _swap(void *p1, void * p2, int size)
{int i = 0;for (i = 0; i< size; i++){char tmp = *((char *)p1 + i);*(( char *)p1 + i) = *((char *) p2 + i);*(( char *)p2 + i) = tmp;}
}
void bubble(void *base,//指向第一个元素指针int count , //元素个数int size,//一个元素大小个数int(*cmp )(void *, void *))//两个元素比较函数
{int i = 0;int j = 0;for (i = 0; i< count - 1; i++){for (j = 0; j<count-i-1; j++){if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0){_swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);}}}
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++){printf( "%d ", arr[i]);}printf("\n");return 0;
}
4.sizeof和strlen
1.1 sizeof
我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是 字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。
sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。
#inculde <stdio.h>
int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;
}
1.2 strlen
strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:
1 size_t strlen ( const char * str );
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。
1.3 sizeof 和 strlen的对比
