c语言指针的小问题

一直以为自己对指针了如指掌今天居然被指针卡住了。打算用qsort对一个结构体排序,结构体如下

typedef struct record_duration_element {
    int start_times;
    int end_times;
}record_duration_element;

排序代码如下

static record_duration_element *records[100];
int compares(const void *first, const void *second)
{
    record_duration_element *fir = (record_duration_element *)first; 
    record_duration_element *sec = (record_duration_element *)second;
    return sec->start_times - fir->start_times;
}

打算根据start_times对结构体从小到大排序,刚开始用qsort(records, 4, sizeof(record_duration_element), compares);结果排序出来完全不对,调试发现传进compares里的数据完全不对,开始还以为是待排序数据问题,或者是start_times不能是0或者负数(依稀记得qsort用快排,快排元素不能0或负数,其实都可以),折腾了十几分钟,结果发现还是不行。最后发现是指针问题。

1.qsort要求第一个参数是待排序的指针,第三个参数要求待排序的元素的大小,但是records其实是一个二重指针,所以第三个参数应该是待排序元素指针的大小而不是待排序元素的大小,所以应该是sizeof(record_duration_element*);其次是compares函数也有问题,参数fir,sen其实是个双重指针即(record_duration_element**),qsort第一个参数传双重指针所以fist也是二重指针,所以compares函数应该改成

int compares(const void *first, const void *second)
{
    record_duration_element *fir = *(record_duration_element **)first; 
    record_duration_element *sec = *(record_duration_element **)second;
    return sec->start_times - fir->start_times;
}

然后就对了,指针还是有点绕的,不过也就这点事,工作中没遇见过三重指针,所以掌握二重就够用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值