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的对比
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|