关于int (*cmp)(const void* e1, const void* e2)中的(char*)base+j*width

文章讨论了在实现通用排序函数bubble_sort时,如何处理不同类型指针的比较。通过将基地址base转换为char*来实现按字节的内存偏移,以适应不同数据类型的宽度。然而,这种方法可能会导致类型安全问题,例如,当比较char类型时,使用int*会导致不正确的内存步进。文章强调了这种做法的局限性和可能的解决方案。
摘要由CSDN通过智能技术生成

自拟sort函数

void bubble_sort (void* base, int sz, int width, 
                    int (*cmp)(const void* e1, const void* e2))

其中实现两个未知指针指向的地址内容的比较函数int (*cmp)(const void*e1, const void*e2)

在不知道这两个指针的类型的前提下如何找到实现两个地址中内容的比较

首先将将空指针的base强制转换成char*字符型指针,由于字符型指针的偏移大小为1字节,如下

/char *类型指针 + 1,内存偏移 1 字节;
/int *类型指针 + 1,内存偏移 4 字节;
/double *类型指针 + 1,内存偏移 8 字节。

通过(char*)base+j*width的形式可以很好找到两个内容的地址,转换成char*是因为其偏移大小为1所以代码的兼容性更好,如果要比较的是char类型那么width是1,如果是int类型那么width是4,如果要是doule类型那么width是8。但是强制转换成int*的话,如果要比较的是char类型那么width需要是1/4,因为int*类型指针+1后内存偏移的字节是4,而我们要比较的char类型所占大小仅为1字节。如果是int类型那么width需要是1,如果要是doule类型那么width需要是2。这种写法比较反人类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值