qsort的compare函数/通过对二维数组排序来理解指针

qsort(a,1000,sizeof(int)*2, comp);
 
int comp(const void*a, const void*b) {
	return((int*)a)[0]-((int*)b)[0];
}

如上代码,现在我们有一个int a[1000][2];用上面的comp函数可以实现对这个二维数组以a[i][0]的大小为依据从小到大排序。让我们来分析一下为什么。

首先comp的参数是指向数组元素的指针,至于是怎么判断这两个元素一个比基准元素,一个比基准元素,我们就不得而知了,然后调用comp方法,如果值为负则a指向的元素放在b指向元素的前面,如果值为正则相反。

既然是指向元素的指针那这里传的就是 &(a[i]),这是一个指向int数组类型的指针 int (* [2]),直观上a[i]是一个数组,所以&a[i]是一个指向数组的指针。逻辑上分析:a[i]=*(a+i) ,a本来是数组的名字,在这里退化成指向数组第一个元素的指针,也就是 int (*[2]) 指向int数组类型的指针,然后+i不影响类型,然后 * 运算之后得到一个int数组类型,本来他马上又要退化成指向第一个元素的指针也就是 int * int类型的指针 但是在两个地方数组名是不退化的,一个是sizeof运算,另一个就是&运算,所以对int数组取地址得到的结果是指向int数组的指针。

但他本来是一个指向int的指针,里面放着已经是他这个数组第一个元素的地址了,所以我们转为指向int的指针后面再加个[0]就行了。


这里面还涉及到一个我以前没注意到的知识点:
如果对一个指针&操作或者*操作之后任然是一个指针,那么得到的新变量里的值和旧变量里的值是一样的:
在这里插入图片描述
不然a[i][j]就没法玩了(在a[i][j]a[i]时候得到的int *类型数据他的值就会变成5,然后再*(a[i]+j)就会以5为地址),我以前居然没有注意到φ(* ̄0 ̄)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值