深入解析qsort与冒泡排序 目录一qsort函数二模仿qsort函数利用冒泡排序排序任意类型的数据三sizeof和strlen对比四指针例题1指针-整数2指针-指针3指针复杂计算案例一qsort函数qsort函数作为库函数可以直接用来排序任意类型的数组只需要向里面传递合理的参数即可。语法void qsort(void* basesize_t numsize_t sizeint (*compar)(const void*const void*))分析1base是一个指针指向待排序的数组中的第一个元素2num是数组指向待排序的数组的元素个数3size是一个数组元素的大小4*compar)(const void*const void*)是一个函数指针这个函数指针用来进行补充数组元素排序的规则tmp_t函数的返回值有三种当p1p2时返回正数当p1p2时返回负数当p1p2时返回0p1和p2分别为数组的第一个元素和第二个元素的地址写成p1减p2是升序写成p2减p1是降序strcmp()函数:用来比较字符串的大小p1大于p2返回正数p1小于p2返回负数p1等于p2返回0头文件为include string.h二模仿qsort函数利用冒泡排序排序任意类型的数据分析bubble_sort函数模仿qsort函数设置四个相同的形参。冒泡排序的比较为了保持能通用任意数据利用基地址base转化为char*类型的指针进行地址加减时让步进单位变成一个字节。可以满足不同大小的数据类型的输入。交换同理为了满足任意类型数据的交换设置一个函数这个函数同样以一个字节为单位利用循环一次交换一个字节和数据的大小width实现不同类型元素的交换。对于不同类型的元素冒泡排序是通用的交换也是通用的。不通用的是不同类型元素的比较方法。三sizeof和strlen对比sizeof:1,sizeof是操作符2sizeof计算操作数在内存中所占大小3sizeof不关注操作数中的具体内容补充sizeof括号中的表达式不进行计算sizeof中的内容是地址就一定为4/8例子原因一个文件test.c需要经过编译链接生成test.exe可执行程序再进行运行。sizeof在编译时就需要进行计算。而表达式则需要在运行时才真正计算此时表达式已经使用了。strlen:1,strlen是库函数需要包含头文件#include string.h2,strlen只能计算字符串的大小即字符串中\0前的元素个数。3关注具体内容如果没有“\0就会越界访问继续寻找\0最后生成一个随机数。运用例子1char arr[] abcdef;printf(%d\n, sizeof(arr));运行结果为7arr单独放在sizeof中表示的是整个数组的大小算上“\0总共7个字符。2*arr和arr[1]分别为a和bstrlen遇到实际值时报错只有是地址时会顺着地址找”\0“,遇到时终止。arr 1表示跳过整个数组后的地址没有”\0“,不知道多久遇到”\0“故生成随机值。arr就表示arr整个数组的地址取最小的就是第一个元素的地址。34四指针例题1指针-整数分析根据结构体成员的内存对齐规则结构体的大小为24个字节同时十六进制的0x1其实就是十进制的1加1的大小跟前面是什么类型的数据密切相关展示1,p1 : 0x10000018(24转化为16进制的值0x1000182,p1: 0x100000(数值)1 0x1000013,p1: 0x1000004(int*的大小0x1000042指针-指针分析主要分析p[4][2]的位置。p是一个数组指针指向含有四个元素的数组。已知pa;则p的首元素的地址即为a的首元素的地址。p[4][2]*(*(p4)2)*(p4)a[3][1]因为p为指向一个有四个整形元素的数组的地址数组指针一次跳过四个元素跳过16个就在a[3][1],此时在跳过2个整数就到了a[3][3],a[3][3]和a[4][2]之间差了4个字节。地址差计算p[4][2] - a[4][2] (p 4)[2] - (a 4)[2] (p 4 * 4 2) - (a 4 * 5 2) (p 18) - (a 22) -4故第二个值为-4由于第一个值是地址所以要将-4从补码转化为原码再转化为16进制的地址。-4的补码就是0xFFFFFFFC3指针复杂计算案例分析一级指针表示首元素的地址例如E N P F二级指针表示地址的地址即首元素地址的地址利用地址加上%s即可打印地址处存放的字符串一级指针的加减跳过一个元素二级指针的加减跳过一个地址的地址三级指针的加减跳过一个二级指针的地址

本月热点